Linq 将实体选择到对象的属性中';尽管使用了.Include(),但仍无法填充其相关实体。为什么会这样?
我正在使用EntityFramework4.1,我正在尝试选择一个实体,同时还包括它的一个相关实体集合。这是使用LINQ执行此操作的标准方法。(MacAddressPool是一对多,具有允许的部件号。) 相反,我可能希望这样做以同时获取其他数据:Linq 将实体选择到对象的属性中';尽管使用了.Include(),但仍无法填充其相关实体。为什么会这样?,linq,entity-framework,entity-framework-4.1,Linq,Entity Framework,Entity Framework 4.1,我正在使用EntityFramework4.1,我正在尝试选择一个实体,同时还包括它的一个相关实体集合。这是使用LINQ执行此操作的标准方法。(MacAddressPool是一对多,具有允许的部件号。) 相反,我可能希望这样做以同时获取其他数据: var query = from p in MacAddressPools.Include( "AllowedPartNumbers" ) where p.MacAddressPoolID == 2 select new
var query =
from p in MacAddressPools.Include( "AllowedPartNumbers" )
where p.MacAddressPoolID == 2
select new
{
Pool = p,
AssignedMacAddressCount = pool.MacAddressAssignments.Count( a => a.AssignedDate != null )
};
var pool = query.FirstOrDefault().Pool;
Console.WriteLine( pool.AllowedPartNumbers.IsLoaded );
"False"
为什么这次没有加载相关实体集合?不管我使用匿名类型还是某个类。它不会加载允许的零件号。所使用的SQL命令甚至不加入AllowedPartNumber表
我发现我可以做到这一点:
var query =
from p in MacAddressPools
where p.MacAddressPoolID == 2
select new
{
Pool = p,
AllowedPartNumbers = p.AllowedPartNumbers,
AssignedMacAddressCount = pool.MacAddressAssignments.Count( a => a.AssignedDate != null )
};
var pool = query.FirstOrDefault().Pool;
Console.WriteLine( pool.AllowedPartNumbers.IsLoaded );
"True"
尽管我只是想忽略匿名类型上的AllowedPartNumbers属性,但如果将它放在那里,将使LINQ to实体填充池本身上的AllowedPartNumbers属性。我甚至不需要.Include()
这种奇怪的行为有什么原因吗?加载相关对象默认设置为false,因为这可能会导致非常严重的性能下降,如果对象集合中包含数百或数千项,加载该对象时会发生什么情况 启用实体框架的延迟加载,它将在访问时加载相关属性(调用get of属性)
Include()
不能保证在子查询和投影中工作。您可以在论坛上找到关于这个问题的详细描述,以及Shawn Wildermuth的相关帖子:
var query =
from p in MacAddressPools
where p.MacAddressPoolID == 2
select new
{
Pool = p,
AllowedPartNumbers = p.AllowedPartNumbers,
AssignedMacAddressCount = pool.MacAddressAssignments.Count( a => a.AssignedDate != null )
};
var pool = query.FirstOrDefault().Pool;
Console.WriteLine( pool.AllowedPartNumbers.IsLoaded );
"True"
context.ContextOptions.LazyLoadingEnabled = true;