Можно ли объединить условный запрос LINQ в тот, который выполняется каждый раз? - PullRequest
1 голос
/ 22 ноября 2011

У меня есть два запроса, чтобы отфильтровать список данных. Основная часть запускается каждый раз, и в обычных ситуациях общее количество результатов должно быть сокращено не более чем до дюжины или двух. Когда я редактирую объект Foo вместо создания нового, я также хочу удалить копию, сохраненную в БД, из набора данных, над которым я работаю.

В настоящее время я использую оператор if и второй запрос для его удаления. Есть ли способ объединить условие и второй запрос в первый?

IEnumerable<Foo> myFoos = bar.GetFoos()
    .Where(f => f.Value1 == value1 && f.Value2 == value2);


if (editFoo != null)
   myFoos = myFoos.Where(f => f.ID != editFoo.ID);

Когда я пытаюсь выполнить запросы, предложенные sehe или Dan Seaver, и набираю .ToList() на myFoos, я получаю исключение:

Unable to create a constant value of type 'Foo'. Only primitive types ('such as Int32, String, and Guid') are supported in this context

Я создал фиктивные объекты, которые содержали каждое свойство в моем необработанном запросе, и он выполнялся без ошибок, поэтому я склоняюсь к подозрению, что проблема заключается в том, что Entity Framework не понимает нулевые проверки в предложенных запросах и является раздражать их. Структура сущности была виновата; без него любое решение будет работать как написано.

Ответы [ 2 ]

3 голосов
/ 22 ноября 2011

Булева логика на помощь.

IEnumerable<Foo> myFoos = bar.GetFoos()
    .Where(f => 
        (f.Value1 == value1) && 
        (f.Value2 == value2) &&
        ((editFoo == null) || (f.ID != editFoo.ID)));

То, что заставляет его работать, это ярлык оценки

1 голос
/ 22 ноября 2011

Вы можете сделать что-то вроде:

IEnumerable<Foo> myFoos = bar.GetFoos()
    .Where(f => f.Value1 == value1 &&
           f.Value2 == value2 && 
           ((editFoo != null) ? (f.ID != editFoo.ID) : true) );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...