Linq where column ==(null reference)与column == null不同

我遇到了linq-to-sql的一个相当奇怪的问题。 在以下示例中,

var survey = (from s in dbContext.crmc_Surveys where (s.crmc_Retail_Trade_Id == tradeId) && (s.State_.Equals(state)) select s).First(); 

如果tradeId为null,则其行为不像我特意指定null那样,

 var survey = (from s in dbContext.crmc_Surveys where (s.crmc_Retail_Trade_Id == null) && (s.State_.Equals(state)) select s).First(); 

这是我想要的行为。 事实上,除非两个值都为非null,否则它不会返回任何内容。 我无法弄清楚如何完成这几个不同的linq查询。 有任何想法吗?

where (s.crmc_Retail_Trade_Id == tradeId)更改为

 where (s.crmc_Retail_Trade_Id == tradeId || (tradeId == null && s.crmc_Retail_Trade_Id == null)) 

编辑 – 基于Brant Lamborn的这篇文章 ,看起来以下会做你想要的:

 where (object.Equals(s.crmc_Retail_Trade_Id, tradeId)) 

Null Semantics(LINQ to SQL) MSDN页面链接到一些有趣的信息:

LINQ to SQL没有对SQL强加C#null或Visual Basic没有比较语义。 比较运算符在语法上被翻译为它们的SQL等价物。 语义反映了服务器或连接设置定义的SQL语义。 在默认SQL Server设置下,两个空值被视为不相等(尽管您可以更改设置以更改语义)。 无论如何,LINQ to SQL不考虑查询转换中的服务器设置。

与文字null(无)的比较被转换为适当的SQL版本(为null或不为null)。

排序规则中null(nothing)的值由SQL Server定义; LINQ to SQL不会更改排序规则。

在这一点上不确定,但我怀疑当linq-to-sql将其转换为sql查询字符串时,你会得到一个稍微不同的表达式,直接指定null ,这样在某些时候你最终会将NULL与自身进行比较,并且定义了NULL = NULL是假的。

解决这个问题的另一个选择,就是我遇到了这个问题。

 where (tradeId == null ? s.crmc_Retail_Trade_Id == null : s.crmc_Retail_Trade_Id == tradeId) 

我不熟悉Linq,但总的来说:

NULL表示缺少,未知或未定义的值。 严格来说,变量不能等于NULL ; 提供此构造的低级语言通常这样做是为了方便,因为没有简单的替代方法 – 在更高级别上,通常更好地依赖ISNULLdefined或语言提供的任何function。

一个未定义的变量不等于另一个未定义的变量(同样适用于NULL == NULL)。 Joe Celko有一个很好的例子,可以编写一个查询来查找头发颜色与他们驾驶的车辆颜色相匹配的所有人。 这个查询是否应该与一个到处走路的光头男人相匹配?