В то время как другие ответы здесь будут работы, вы помечено свой вопрос сущность-рамки, и в любое время вы пишете 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.