如何在实体框架中查询空值?

如何在实体框架中查询空值?

我想执行这样的查询


   var result = from entry in table

                     where entry.something == null

                     select entry;

并得到一个IS NULL生成。


编辑:在前两个答案后,我觉得有必要澄清我正在使用实体框架而不是Linq to SQL。object.Equals()方法似乎不适用于EF。


编辑2:上述查询按预期工作。它正确生成IS NULL。然而,我的生产代码是


value = null;

var result = from entry in table

                         where entry.something == value

                         select entry;

并且生成的SQL是something = @p; @p = NULL。似乎EF正确地转换了常量表达式,但是如果涉及变量,它就像正常比较一样处理它。实际上是有道理的。我会结束这个问题


慕神8447489
浏览 332回答 3
3回答

陪伴而非守候

Linq-to-SQL的解决方法:var result = from entry in table             where entry.something.Equals(value)              select entry;Linq-to-Entities的解决方法(哎哟!):var result = from entry in table             where (value == null ? entry.something == null : entry.something == value)              select entry;这是一个令人讨厌的虫子,几次咬我。 如果此错误也影响了您,请访问UserVoice上的错误报告,并让Microsoft知道此错误也会影响您。编辑: 此错误正在EF 4.5中修复!感谢大家提出这个错误!为了向后兼容,它将选择加入 - 您需要手动启用设置才能entry == value工作。还没有关于这个设置是什么的消息。敬请关注!编辑2: 根据EF团队的这篇文章,这个问题已经在EF6中得到修复!哇噢!我们更改了EF6的默认行为以补偿三值逻辑。这意味着依赖于旧行为的现有代码(null != null但仅在与变量进行比较时)将需要更改为不依赖于该行为,或者设置UseCSharpNullComparisonBehavior为false以使用旧的行为。

白板的微信

从Entity Framework 5.0开始,您可以使用以下代码来解决您的问题:public abstract class YourContext : DbContext{   public YourContext()   {     (this as IObjectContextAdapter).ObjectContext.ContextOptions.UseCSharpNullComparisonBehavior = true;   }}这应该可以解决您的问题,因为实体Framerwork将使用'C#like'null比较。
打开App,查看更多内容
随时随地看视频慕课网APP