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 如何在实体框架核心中加载对象图?_Linq_Entity Framework Core - Fatal编程技术网

Linq 如何在实体框架核心中加载对象图?

Linq 如何在实体框架核心中加载对象图?,linq,entity-framework-core,Linq,Entity Framework Core,我需要获取一些关系数据 from user in Users .Include("UserCategoryPermissions") .Include("UserResourcePermissions") .Include("UserPermissions.Permission.Application") .Include("UserGroupMembers.UserGroup.UserGroupPermissions.Permission.Application") where

我需要获取一些关系数据

from user in Users
  .Include("UserCategoryPermissions")
  .Include("UserResourcePermissions")
  .Include("UserPermissions.Permission.Application")
  .Include("UserGroupMembers.UserGroup.UserGroupPermissions.Permission.Application")
where user.Id == 3
实体框架核心通过执行多个查询来获取此数据。我所要做的就是将一个对象图加载到内存中(无投影),多个查询将真正降低速度

我可以通过使用大量连接进行大规模查询来预加载这些对象

from a in A
join b in B on a.Id equals b.A_Id into bJoin from b in bJoin.DefaultIfEmpty()
join c in C on b.Id equals c.B_Id into cJoin from c in cJoin.DefaultIfEmpty()
join x in X on a.Id equals x.A_Id into xJoin from x in xJoin.DefaultIfEmpty()
// etc
select new {
  a, b, c, x
}

但每次我想获取数据时都必须这样做,这将是一个真正的痛苦。有没有办法让Entity Framework Core预加载数据图?理想情况下,我希望它从一个字符串数组开始工作,其中每个字符串标识一个路径(如上所述),但我很乐意了解这些图形通过参数传递给方法的任何方式。

我通常使用lambda语法,它在一次调用中获取所有数据:

using System.Linq;
using Microsoft.EntityFrameworkCore;
...

var userFound = context.Users
    .Include(user => user.UserCategoryPermissions)
    .Include(user => user.UserResourcePermissions)
    .Include(user => user.UserPermissions)
    .ThenInclude(map => map.Permission)
    .ThenInclude(permission => permission.Application)
    .Include(user => user.UserGroupMembers)
    .ThenInclude(members => members.UserGroup)
    .ThenInclude(group => group.UserGroupPermissions)
    .ThenInclude(map => map.Permissions)
    .ThenInclude(permission => permission.Application)
    .Where(user => user.Id == 3);

请注意,在
包含
包含
的lambda中,intellisense无法正常工作。只需盲输入正确的属性名,它就可以工作。

EF现在就是这样实现的。但不要轻易下结论说一个电话会表现更好。EF6中的Include(总是一个调用)往往会大大降低查询速度。@GertArnold我发现6个查询的速度为250-300ms,而带有连接的单个查询的速度为60ms。这很有说服力:)我知道他们正在进行这项工作,但我现在找不到问题编号。多个查询是“设计的”——例如,请参阅。唯一的优化是针对0..1基数(引用)导航属性或类似的特定情况,这没有任何区别,只是使用不同的语法实现了相同的效果。EF core只对包含运行多个查询。不,这会为每个包含生成额外的查询