今天在我的Linq-To-Entitites查询中,我偶然发现了一个null引用异常,我想知道这是怎么可能的。看起来作为OR门的条件OR在Linq-To-Entities中没有效果。我的查询的一个简化示例如下:
from a in db.Articles
where a.Author == "John Doe"
&& (tag == null || a.Tags.Any(t => t.TagName == tag.TagName))
select a;现在,当标记为NULL时,where查询的右侧仍然会执行,并且在tag.TagName上会发生NULL引用异常。也许这是因为Linq-To-Entities总是将完整的语句转换成SQL?
不管怎样..。如何解决这个问题?
非常感谢:)
发布于 2013-03-31 21:11:08
var query = db.Articles.Where(x => x.Author == "John Doe");
query = tag == null
? query
: query.Where(x => x.TagName == tag.TagName);或者:
var query = from a in db.Articles
where a.Author == "John Doe"
select a;
query = tag == null
? query
: from a in query
where a.Tags.Any(t => t.TagName == tag.TagName)
select a;就我个人而言,我觉得第一个更干净
发布于 2013-03-31 21:28:45
想一想sql。Linq将您的代码作为一个整体转换为sql查询,将“外部”对象作为参数传递并对其求值。这就是它在计算null对象时失败的原因。
基于条件逐位构造linq查询是一种很好的做法,以减少结果查询中不必要的代码数量,因此最好拆分查询:
var query = db.Articles.Where(x => x.Author == "John Doe");
if( tag != null)
query = query.Where(x => x.TagName == tag.TagName);由于您的查询将在选择时评估和执行,因此欢迎您添加更多条件,而不必担心多个请求。
https://stackoverflow.com/questions/15723978
复制相似问题