我遇到了这种奇怪的行为,并想知道它是如何工作的。
_dbContext.MyDbSet.Where(setItem =>
setItem.InnerCollection.All(...)
).ToList()
即使InnerCollection为null,这段代码也能正常工作。令我惊讶的是,这两个部分都在内部集合上抛出了ArgumentNullException。
_dbContext.MyDbSet.Local.Where(setItem =>
setItem.InnerCollection.All(...)
).ToList()
_dbContext.MyDbSet.ToList().Where(setItem =>
setItem.InnerCollection.All(...)
).ToList()
有人能解释一下这怎么可能吗?DbSet后面有null
约束吗?提前谢谢。
第一个问题的答案很简单:
使用时
_dbContext.MyDbSet.Where(setItem =>
setItem.InnerCollection.All(...)
).ToList()
EF生成一个JOIN语句,并对数据库执行筛选,因此不会引发ArgumentNullException
。
而在筛选之前调用Local
或ToList()
时,所有实体都会从数据库中加载并在内存中进行筛选。因此,在这个版本中,如果不包括相应的导航属性并且出现ArgumentNullException
,则列表为空。