Linq查询中为null

时间:2011-08-11 07:07:44

标签: c# .net linq entity-framework

我使用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.SubTypeIDnot.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.SubTypeIDnull时,这两个查询之间有什么区别。

1 个答案:

答案 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测试可能是您问题的根源。