C# 在Linq to实体中是有条件的还是没有效果?

C# 在Linq to实体中是有条件的还是没有效果?,c#,linq,entity-framework,linq-to-entities,C#,Linq,Entity Framework,Linq To Entities,今天,我在一个LINQtoEntities查询中偶然发现了一个null-ref异常,我想知道这是怎么可能的。似乎条件OR用作OR门在Linq To实体中没有效果。我的查询的一个简化示例如下: from a in db.Articles where a.Author == "John Doe" && (tag == null || a.Tags.Any(t => t.TagName == tag.TagName)) select a; 现在,当标记为NULL时,查询的右侧仍

今天,我在一个LINQtoEntities查询中偶然发现了一个null-ref异常,我想知道这是怎么可能的。似乎条件OR用作OR门在Linq To实体中没有效果。我的查询的一个简化示例如下:

from a in db.Articles
where a.Author == "John Doe"
&& (tag == null || a.Tags.Any(t => t.TagName == tag.TagName))
select a;
现在,当标记为NULL时,查询的右侧仍会执行,并且tag.TagName上会出现NULL引用异常。也许这是因为LINQtoEntities总是将完整的语句转换成SQL

无论如何。。。如何回避这个问题

非常感谢:)

或:

就我个人而言,我发现第一个更干净

或:


就我个人而言,我发现第一个更干净

想想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);

因为您的查询将在选择时进行计算和执行,所以欢迎您添加更多条件,而无需担心多个请求。

考虑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);

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

非常感谢,Matt!我现在很好奇生成的SQL会是什么样子。。。我会试试看:)非常感谢,马特!我现在很好奇生成的SQL会是什么样子。。。将尝试:)感谢Dima,也感谢他确认Linq-To-Entities将整个查询直接转换为SQL并且不应用任何C#逻辑的行为。感谢Dima,也感谢他确认Linq-To-Entities将整个查询直接转换为SQL并且不应用任何C#逻辑的行为。
var query = db.Articles.Where(x => x.Author == "John Doe");
if( tag != null)
  query = query.Where(x => x.TagName == tag.TagName);