我使用Linq到EF并尝试从ObjectSet获取FirstOrDefault权限。 查询如下所示:
Notification not = new Notification();
........
//not.SubTypeID = null;
var elem = ent.Notifications.FirstOrDefault(p =>
p.ID == not.ID &&
p.SubTypeID == not.SubTypeID &&
p.Location == not.Location &&
p.TypeID == ns.TypeID
);
有时候SubTypeID
可以是null
,在这种情况下,elem
althogh p.SubTypeID
和not.SubTypeID
中的任何内容都不会null
。< / p>
但奇怪的是,当我运行此查询时:
var elem = ent.Notifications.FirstOrDefault(p =>
p.ID == not.ID &&
p.SubTypeID == null &&
p.Location == not.Location &&
p.TypeID == ns.TypeID
);
一切都按预期工作,我在elem
中看到数据。
所以我做错了,当not.SubTypeID
为null
时,这两个查询之间有什么区别。
答案 0 :(得分:1)
在C#中,null == null
的结果为真。但是在SQL中,这个表达式树被编译成了,NULL = NULL
的结果是NULL
。关于PostgreSQL的例子:
SELECT 1 WHERE NULL = NULL;
?column?
----------
(0 rows)
您可以考虑使用如下表达式:
p.SubTypeID == not.SubTypeID ||
(p.SubTypeID == null && not.SubTypeID == null)
这是一种黑客行为,可能有一个比这更好的解决方案。但NULL = NULL
测试可能是您问题的根源。