Asp.net mvc Entityframework查询,仅当变量不为null时选择,否则不要';t选择

Asp.net mvc Entityframework查询,仅当变量不为null时选择,否则不要';t选择,asp.net-mvc,entity-framework,Asp.net Mvc,Entity Framework,我有这样的疑问: var p = form p in db.table where(p.Id == variable1 && p.proId == variable2 ...) select p.Tolist(); 例如,如果变量1为null,则不要在where子句中比较该条件,只取where子句 where (p.proId == variable2 ...) 有没有办法做到这一点。提前谢谢。你不能在where子句中签入null吗 where((

我有这样的疑问:

 var p = form p in db.table 
     where(p.Id ==  variable1  && p.proId == variable2 ...)
     select p.Tolist();
例如,如果变量1为null,则不要在where子句中比较该条件,只取where子句

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

有没有办法做到这一点。提前谢谢。

你不能在
where
子句中签入
null

where((variable1 == null || p.Id == variable1) 
    && (variable2 != null && p.proId == variable2))
就这么简单:

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

虽然这里的其他答案也会起作用,但您标记了您的问题实体框架,并且无论何时您将LINQ写入实体,都必须牢记
IQueryable
/
IEnumerable
边界,因为只有完全符合
IQueryable
的代码才能有效地转换为SQL(很多时候,例如,
string.Format
,根本不可转换)

请注意,如果改为将LINQ写入对象,则给出的其他答案将更加高效、简洁和可读:

var q = from p in someEnumerable
        where null == variable1 || p.Id == variable1
        where p.proId == variable2
        select p;
注意:我省略了
.ToList()
,以将查询保持为
IQueryable
(或
IEnumerable
),因为有很多次您实际上只希望通过查询枚举一次,或者在解析查询之前投影到更简单的内容(例如,
选择p.Id
)。这在L2E的情况下尤其重要,因为在
.ToList()
(或
.ToArray()
.Load()
)之前所做的一切都可以直接转换为SQL,这是使用EF最强大的方式

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