Entityframework查询,仅选择if变量是否为null否则不选择

时间:2015-09-02 09:24:42

标签: 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 ...)

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

3 个答案:

答案 0 :(得分:1)

您是否只能null检查where条款?

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

答案 1 :(得分:1)

就像这样简单:

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

答案 2 :(得分:0)

虽然中的其他答案可以正常工作,但您标记了您的问题实体框架,并且无论何时编写LINQ到实体,您的IQueryable /都非常重要牢记IEnumerable边界,因为只有完全符合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-to-Objects,则给出的其他答案更有效,更简洁,更易读:

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的最强大的方法。