我有这样的疑问:
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 ...)
有没有办法做到这一点。提前谢谢。
答案 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的最强大的方法。