首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >条件OR在Linq-to-entities中没有效果吗?

条件OR在Linq-to-entities中没有效果吗?
EN

Stack Overflow用户
提问于 2013-03-31 06:02:58
回答 2查看 331关注 0票数 1

今天在我的Linq-To-Entitites查询中,我偶然发现了一个null引用异常,我想知道这是怎么可能的。看起来作为OR门的条件OR在Linq-To-Entities中没有效果。我的查询的一个简化示例如下:

代码语言:javascript
复制
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?

不管怎样..。如何解决这个问题?

非常感谢:)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-31 21:11:08

代码语言:javascript
复制
var query = db.Articles.Where(x => x.Author == "John Doe");
query = tag == null
    ? query
    : query.Where(x => x.TagName == tag.TagName);

或者:

代码语言:javascript
复制
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;

就我个人而言,我觉得第一个更干净

票数 3
EN

Stack Overflow用户

发布于 2013-03-31 21:28:45

想一想sql。Linq将您的代码作为一个整体转换为sql查询,将“外部”对象作为参数传递并对其求值。这就是它在计算null对象时失败的原因。

基于条件逐位构造linq查询是一种很好的做法,以减少结果查询中不必要的代码数量,因此最好拆分查询:

代码语言:javascript
复制
var query = db.Articles.Where(x => x.Author == "John Doe");
if( tag != null)
  query = query.Where(x => x.TagName == tag.TagName);

由于您的查询将在选择时评估和执行,因此欢迎您添加更多条件,而不必担心多个请求。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15723978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档