2015-09-02 3 views
0

У меня есть такой запрос:Entityframework запрос, выберите только если переменная не является нулевым еще не выбран

var p = form p in db.table 
    where(p.Id == variable1 && p.proId == variable2 ...) 
    select p.Tolist(); 

и для, например. если переменная 1 равна нулю, не сравнить это условие в том, где пункт просто взять где положение

where (p.proId == variable2 ...) 

Есть ли способ сделать это. Заранее спасибо.

ответ

1

Не можете ли вы просто null проверить в статье where?

where((variable1 == null || p.Id == variable1) 
    && (variable2 != null && p.proId == variable2)) 
1

Просто просто так:

where((variable1 == null || p.Id == variable1) && p.proId == variable2 ...) 
0

В то время как другие ответы здесь будут работы, вы помечено свой вопрос сущность-рамки, и в любое время вы пишете LINQ-to-Entities, это очень важно иметь свою границу , потому что только полностью совместимый код IQueryable эффективно конвертируется в SQL (и много раз, например, string.Format, вообще не конвертируется).

var q = null != variable1 
    ? from p in db.table 
     where p.Id == variable1 
     where p.proId == variable2 
     select p 
    : from p in db.table 
     where p.proId == variable2 
     select p; 

Обратите внимание, что, если запись LINQ к объектам вместо этого, другие ответы, данные являются гораздо более эффективными, сжато, и читаем:

var q = from p in someEnumerable 
     where null == variable1 || p.Id == variable1 
     where p.proId == variable2 
     select p; 

Примечание: Я оставил выключение .ToList() держать запрос как IQueryable (или IEnumerable), потому что столько раз вы действительно хотите перечислить запрос только один раз или проецировать на что-то более простое, прежде чем разрешать запрос (например, select p.Id). Это особенно важно в случае L2E, потому что все, что вы делаете до .ToList() (или .ToArray() или .Load()), составляет , которое можно конвертировать в SQL, что является самым мощным способом использования EF.

Смежные вопросы