我遇到了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查询。有什么想法吗?
答案 0 :(得分:30)
更改where (s.crmc_Retail_Trade_Id == tradeId)
到
where (s.crmc_Retail_Trade_Id == tradeId ||
(tradeId == null && s.crmc_Retail_Trade_Id == null))
编辑 - 基于Brant Lamborn的this post,看起来以下内容可以满足您的需求:
where (object.Equals(s.crmc_Retail_Trade_Id, tradeId))
Null Semantics (LINQ to SQL) MSDN页面链接到一些有趣的信息:
LINQ to SQL不会强制使用C#null或 Visual Basic没什么比较 关于SQL的语义。比较运算符 在语法上被翻译成他们的 SQL等价物。语义反映 服务器或服务器定义的SQL语义 连接设置。两个空值 在违约情况下被视为不平等 SQL Server设置(尽管你可以 更改设置以更改 语义)。无论如何,LINQ to SQL 不考虑服务器设置 查询翻译。
与文字null的比较 (没有)被翻译成了 适当的SQL版本(为null或是 不是空的)。
null(无)的值 排序规则由SQL Server定义; LINQ to SQL不会改变 排序规则。
答案 1 :(得分:2)
在这一点上不确定,但我怀疑当linq-to-sql将其转换为sql查询字符串时,你会得到一个稍微不同的表达式,直接指定null
,这样在某些时候你最终会将NULL与自身进行比较,NULL = NULL定义为false。
答案 2 :(得分:2)
解决这个问题的另一个选择是,我也遇到了这个问题。
where (tradeId == null ? s.crmc_Retail_Trade_Id == null : s.crmc_Retail_Trade_Id == tradeId)
答案 3 :(得分:1)
我不熟悉Linq,但总的来说:
NULL
表示缺失,未知或未定义的值。严格来说,变量不能等于NULL
;提供此构造的低级语言通常这样做是为了方便,因为没有简单的替代方案 - 在更高级别上,通常更好地依赖ISNULL
,defined
或您的语言提供的任何功能
一个未定义的变量不等于另一个未定义的变量(同样适用于NULL == NULL)。 Joe Celko有一个很好的例子,可以编写一个查询来查找头发颜色与他们驾驶的车辆颜色相匹配的所有人。这个查询是否应该与到处走路的秃头男人相匹配?
答案 4 :(得分:0)
为此目的最好使用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();