Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq 将实体选择到对象的属性中';尽管使用了.Include(),但仍无法填充其相关实体。为什么会这样?_Linq_Entity Framework_Entity Framework 4.1 - Fatal编程技术网

Linq 将实体选择到对象的属性中';尽管使用了.Include(),但仍无法填充其相关实体。为什么会这样?

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

我正在使用EntityFramework4.1,我正在尝试选择一个实体,同时还包括它的一个相关实体集合。这是使用LINQ执行此操作的标准方法。(MacAddressPool是一对多,具有允许的部件号。)

相反,我可能希望这样做以同时获取其他数据:

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;