DbSet LINQ 查询到内部集合不会抛出 Argumentexception
DbSet LINQ query to inner collection does not throw an Argumentexception
我遇到了这种奇怪的行为,想知道它背后的原理是什么。
_dbContext.MyDbSet.Where(setItem =>
setItem.InnerCollection.All(...)
).ToList()
即使 InnerCollection 为空,这段代码也能正常工作。令我惊讶的是,这两部分都在内部集合上抛出 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
,则列表为空。
我遇到了这种奇怪的行为,想知道它背后的原理是什么。
_dbContext.MyDbSet.Where(setItem =>
setItem.InnerCollection.All(...)
).ToList()
即使 InnerCollection 为空,这段代码也能正常工作。令我惊讶的是,这两部分都在内部集合上抛出 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
,则列表为空。