Как в Entity framework динамически изменять критерий для выборки?

Доброе время суток, Тостеряне!
Решил я познакомиться с фреймворком Entity Framework. Для универсальности скрипта нужно в одной и той же таблице сделать выборку по одному из трех критериев. В дальнейшем со всеми результатами пройдет одинаковая обработка.

Текущая реализация:
var targetType = "G"; //целевой тип отчета. G - группа, T - преподаватель, C - кабинет
            int targetId = 2; // ID целевой группы/препода/кабинета
            var loadDb = db.Events.Where(l => l.cabinet == targetId.ToString());
            switch (targetType)
            {
                case "G": loadDb = db.Events.Where(l => l.group == targetId.ToString()); break;
                case "T": loadDb = db.Events.Where(l => l.teacher == targetId.ToString()); break;
                case "C": loadDb = db.Events.Where(l => l.cabinet == targetId.ToString()); break;
                default: targetType = "Error"; break;
            }

При этом происходит инициализация переменной путем лишнего запроса к БД. Как привести запрос к следующему виду:
switch (targetType)
            {
                case "G":  запрос  = l => l.group == targetId.ToString(); break;
                case "T":  запрос  = l => l.teacher == targetId.ToString(); break;
                case "C":  запрос  = l => l.cabinet == targetId.ToString(); break;
                default: targetType = "Error"; break;
            }
            if (targetType != "Error") 
            {
            var loadDb = db.Events.Where( запрос );
            }
  • Вопрос задан
  • 67 просмотров
Решения вопроса 1
Jeer
@Jeer
уверенный пользователь
Вы немношк запутались )
Когда вы выполняете строку
var loadDb = db.Events.Where(l => l.cabinet == targetId.ToString());

У вас нет запроса к базе. В этой строке создается лишь сам запрос, то есть формируется sql код на основе вашего запроса. Он никуда в базу не отправляется. И присваивается в переменную loadDb
Далее, когда вы делаете, например,
case "G": loadDb = db.Events.Where(l => l.group == targetId.ToString()); break;

Вы в переменную loadDb записываете другой сформированный запрос. Вы просто перезаписываете переменную. Запросов к базе в таком случае так же не поступает.
Отвечая на ваш вопрос, скорее всего, вы хотите на один запрос наложить дополнительное условие. В вашем коде это будет выглядеть примерно так:
var loadDb = db.Events.Where(l => l.cabinet == targetId.ToString());
            switch (targetType)
            {
                case "G": loadDb = loadDb.Where(l => l.group == targetId.ToString()); break;
...


А само выполнение запроса к базе происходит, когда вы вызываете методы, отдающие результат, например
var res = loadDb.ToList()
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@DancingOnWater
В чем проблема? Where выполняет предикат, т.е. тебе надо что-то типа
Func<тип записи, bool> запрос;
switch (targetType)
            {
                case "G":  запрос  = l => l.group == targetId.ToString(); break;
                case "T":  запрос  = l => l.teacher == targetId.ToString(); break;
                case "C":  запрос  = l => l.cabinet == targetId.ToString(); break;
                default: targetType = "Error"; break;
            }
            if (targetType != "Error") 
            {
            var loadDb = db.Events.Where( запрос );
            }
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы