我遇到了这个问题,并没有在网上找到解决方案。因此,我希望将此情况和我的发现记录在其他可能面临类似问题的人身上。
这不是所有其他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
?
答案 0 :(得分:0)
我终于意识到自己被误导了。尽管调试人员在说什么,但a
并非null
。 c
为null
。这是一个简单的问题和简单的解决方法:
from a in db.Attributes.Where(a => c != null ? a.ItemId == c.ChildItemId : false).DefaultIfEmpty()
我希望这有助于将来因错误消息误导而导致h>1
小时混淆。您无法始终信任调试器或错误消息。