LINQ匿名函数参数引用未设置为对象的实例

时间:2016-12-05 16:54:55

标签: c# linq

我遇到了这个问题,并没有在网上找到解决方案。因此,我希望将此情况和我的发现记录在其他可能面临类似问题的人身上。

这不是所有其他LINQ和Null参考问题的重复。我在研究这个时读过这些,我的情况不是对LINQ的无知,也不是对OOP的无知。事实上,两个不同的环境指向了错误的数据点。

这是我对一个非常复杂的LINQ查询的精炼,以打到SQL Server数据库。

var query = from i in db.Items
            join s in db.Stores on i.Id equals s.ItemId
            from c in db.Sets.Where(t => t.ChildItemId == i.Id && t.StoreId = s.Id).DefaultIfEmpty()
            from a in db.Attributes.Where(a => a.ItemId == c.ChildItemId).DefaultIfEmpty()
            where i.IsActive && s.IsActiveAtStore
            select new
            {
                Id = c != null ? c.ParentItemId : i.Id,
            }
            ...

N.b。左连接。

(实际)LINQ编译。它还正确且成功地查询了数据库。

但我的任务是用对象数据对此查询进行单元测试。当我运行单元测试时,他们在属性子句中一直没有成功:

from a in db.Attributes.Where(a => a.ItemId == c.ChildItemId).DefaltIfEmpty()

Visual Studio抱怨Reference not set to an instance of an object。这个查询实际上非常大,当然,无法调试。所以我在LinqPad中嘲笑它,它也说了同样的话。它添加的是a是问题所在。也就是说,指示错误的波浪形在a的第一(a => a.ItemId...)之下。但是这a永远不会是null。如果它是null,则db.Attributes中没有任何内容,Where将不会运行匿名函数。问题是a null

1 个答案:

答案 0 :(得分:0)

我终于意识到自己被误导了。尽管调试人员在说什么,但a并非nullcnull。这是一个简单的问题和简单的解决方法:

from a in db.Attributes.Where(a => c != null ? a.ItemId == c.ChildItemId : false).DefaultIfEmpty()

我希望这有助于将来因错误消息误导而导致h>1小时混淆。您无法始终信任调试器或错误消息。