Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq,其中column==(null引用)与column==null不同_C#_.net_Linq_Linq To Sql - Fatal编程技术网

C# Linq,其中column==(null引用)与column==null不同

C# Linq,其中column==(null引用)与column==null不同,c#,.net,linq,linq-to-sql,C#,.net,Linq,Linq To Sql,我在LINQtoSQL中遇到了一个相当奇怪的问题。在下面的示例中 var survey = (from s in dbContext.crmc_Surveys where (s.crmc_Retail_Trade_Id == tradeId) && (s.State_.Equals(state)) select s).First(); 如果

我在LINQtoSQL中遇到了一个相当奇怪的问题。在下面的示例中

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查询。有什么想法吗?

关于这一点我不确定,但我怀疑当linq转换成sql查询字符串时,您会得到一个稍微不同的表达式,直接指定
null
,这样在某个时候您会将null与自身进行比较,null=null被定义为false。

更改
where(s.crmc\u Retail\u Trade\u Id==tradeId)

编辑-基于Brant Lamborn的,它看起来可以满足您的需要:

where (object.Equals(s.crmc_Retail_Trade_Id, tradeId))
MSDN页面链接到一些有趣的信息:

LINQ to SQL不强制使用C#null或 Visual Basic无任何比较 SQL上的语义。比较运算符 从语法上翻译为 SQL等价物。语义反映了 由服务器或服务器定义的SQL语义 连接设置。两个空值 在违约情况下被视为不平等 SQL Server设置(尽管您可以 更改设置以更改 语义)。不管怎样,LINQ都支持SQL 不考虑服务器设置 查询翻译

与文本null的比较 (无)被翻译为 适当的SQL版本(为null或为 不为空)

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


我对Linq不熟悉,但总体而言:

NULL
表示缺少、未知或未定义的值。严格地说,一个变量不能等于
NULL
;提供这种结构的低lvel语言通常是为了方便起见,因为没有简单的替代方法——在更高的级别上,通常最好依赖于
ISNULL
定义的
,或者您的语言提供的任何功能


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

解决这个问题的另一个选择,因为我也遇到了这个问题

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

最好为此目的创建sp,因为如果您使用linq,linq将执行为您提供帮助所需的迭代

var c = lstQ_Buffer.Where(q => (((semesterId == 0 || semesterId == null ? q.fkSemesterId == null : q.fkSemesterId == semesterId) && (subjectSpecialtyId == 0 || subjectSpecialtyId == null ? q.fkSubSpecialtyId == null : q.fkSubSpecialtyId == subSpecialtyId) && (subTopicId == 0 || subTopicId == null ? q.fkSubTopicId == null : q.fkSubTopicId == subTopicId)) && (q.fkProgramId == programId && q.fkYearId == yearId && q.fkCourse_ModuleId == courseModuleId && q.fkSubject_SpecialtyId == subjectSpecialtyId && q.fkTopicId == topicId && q.fkDifficultyLevelId == diffucultyLevelId))).ToList();

除非ANSI_NULLS设置为OFF。但这会导致宇宙内爆。是的,我想这是显而易见的答案。但好奇的人想知道为什么常量null不同于指向null的变量。我怀疑Joel Coehoorn是正确的,您问题中的第二个案例被转换为直接指定null的sql查询。这似乎是Microsoft linq解析器中一个非常大的缺陷,甚至是一个不处理null对象引用的bug适当地,但我相信你的话。“适当地”是非常主观的-我从MSDN中添加了一些文本,解释了LINQ的作用。我刚刚尝试了object。Equals解决方法,它适用于可为空的整数,但不适用于字符串。(使用LINQ到EF,而不是LINQ到SQL)我认为一个男人不存在的头发的颜色被认为与他不存在的汽车油漆相匹配是很有道理的。在低级或高级语言中,null是十六进制值0x0,null==null是真的。现在我知道这在SQL中是不正确的,但C#不是SQL,我们希望这能保持下去。Linq到Sql应该是C#用户的抽象。如果你问我,我错了吗?的确。我更想向好奇的人解释为什么常数null不同于指向null的变量。在大多数情况下,null相当于0x0,如果您需要指向内存段开头的指针,这将是一个严重的问题(谢天谢地,这不再是一个问题)。我说相等是因为我认为相等和相等有细微的区别。就像说1.99999999。。。不等于2,只是数学上的不便,它们恰好是相同的值。我宁愿认为它们是不同的。在Perl中,定义了0。在PHP 0中!==无效的在SQL 0中!=无效的在XSLT中,设置为0的属性与未定义的属性不匹配。我们应该记住,即使你的语言允许,它仍然是一个不确定性的测试,而不是平等性的测试。我想它如何从C#翻译成SQL取决于它是由C#家伙还是SQL家伙实现的。但是如果它被认为是C程序员的一种抽象,而它没有达到C程序员的期望,那么微软确实把这只狗搞砸了。(请注意,即使它真的像预期的那样工作,我还是会怀疑在某处发生了一些狗狗性交。)
var c = lstQ_Buffer.Where(q => (((semesterId == 0 || semesterId == null ? q.fkSemesterId == null : q.fkSemesterId == semesterId) && (subjectSpecialtyId == 0 || subjectSpecialtyId == null ? q.fkSubSpecialtyId == null : q.fkSubSpecialtyId == subSpecialtyId) && (subTopicId == 0 || subTopicId == null ? q.fkSubTopicId == null : q.fkSubTopicId == subTopicId)) && (q.fkProgramId == programId && q.fkYearId == yearId && q.fkCourse_ModuleId == courseModuleId && q.fkSubject_SpecialtyId == subjectSpecialtyId && q.fkTopicId == topicId && q.fkDifficultyLevelId == diffucultyLevelId))).ToList();