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

Boo*_*oog 26 .net c# linq linq-to-sql

我遇到了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();
Run Code Online (Sandbox Code Playgroud)

如果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();
Run Code Online (Sandbox Code Playgroud)

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

jba*_*all 33

更改where (s.crmc_Retail_Trade_Id == tradeId)

where (s.crmc_Retail_Trade_Id == tradeId || 
      (tradeId == null && s.crmc_Retail_Trade_Id == null))
Run Code Online (Sandbox Code Playgroud)

编辑 - 根据Brant Lamborn的这篇文章,看起来以下会做你想要的:

where (object.Equals(s.crmc_Retail_Trade_Id, tradeId))
Run Code Online (Sandbox Code Playgroud)

null语义(LINQ到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不会更改排序规则.

  • 我刚刚尝试了object.Equals解决方法,它可以使用可空的整数,但不能使用字符串.(使用LINQ to EF,而不是LINQ to SQL) (6认同)