LINQ包含子级值错误
本文关键字:错误 包含 LINQ | 更新日期: 2023-09-27 18:11:34
我有这个查询:
var allValues = from p in _pContext.Persons
where p.Id == currentPerson.Id
from i in p.Items //This is a list that contains "Items"
select i;
我想要所有的项和它们包含的所有嵌套值。在执行此查询时,如何加载这些?我知道我可以在上下文中使用include语句,但这不会带来任何结果。如果我这样做:
var allValues = from p in _pContext.Persons.Include("Items.Properties")
where p.Id == currentPerson.Id
from i in p.Items //This is a list that contains "Items"
select i;
要加载所有项目及其关联的"属性",这些属性不会被加载,它们的列表会被实例化,但其中不包含任何属性。
Include
有很多欺骗性的怪癖。其中之一是,如果应用查询形状后查询形状发生变化,则会忽略Include
。这种情况发生在你的情况下。如果查询如下所示,则Inlude
工作:
from p in _pContext.Persons.Include("Items.Properties")
select p
这是因为路径"Items.Properties"
在最终结果Person
中是可从实体遍历的。
但是现在您可以通过更改返回的实体来更改查询的形状。。。
from p in _pContext.Persons.Include("Items.Properties")
from i in p.Items
select i
并且包含路径不再有效。(Item
外不可通行(。
对于Include
,有一条简单的经验法则:在查询结束时应用它。这样,您将自动输入正确的路径,尤其是当您使用lambda语法时:
(from p in _pContext.Persons
from i in p.Items
select i).Include("Properties")
或
(from p in _pContext.Persons
from i in p.Items
select i).Include(i => i.Properties)