Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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
复EF图linq连接_Linq_Entity Framework - Fatal编程技术网

复EF图linq连接

复EF图linq连接,linq,entity-framework,Linq,Entity Framework,所以,这就是我的模型。。漂亮而复杂 我希望通过用户ID获取区域。如果我在SQL中这样做,我会执行一系列连接,一直到用户表。在LINQ查询语法或方法链接中,您将如何做到这一点 我可以从另一个角度非常简单地完成这项工作,但是我必须做很多额外的工作来展平结果图,而且还需要拉回中间的所有实体 如果我可以选择包括AreaPermissions和Permissions,那将是非常重要的。。但在这一点上,我不介意使用额外的查询来获取这些信息 我浮动的另一个选项是使用函数导入存储过程并将其映射到区域。。但当我开

所以,这就是我的模型。。漂亮而复杂

我希望通过用户ID获取区域。如果我在SQL中这样做,我会执行一系列连接,一直到用户表。在LINQ查询语法或方法链接中,您将如何做到这一点

我可以从另一个角度非常简单地完成这项工作,但是我必须做很多额外的工作来展平结果图,而且还需要拉回中间的所有实体

如果我可以选择包括AreaPermissions和Permissions,那将是非常重要的。。但在这一点上,我不介意使用额外的查询来获取这些信息

我浮动的另一个选项是使用函数导入存储过程并将其映射到区域。。但当我开始需要包含其他实体时,它会使该选项变得不那么优雅。我还试图避免仅仅为了使用存储过程而使用存储过程,因为人们总是在走下坡路……”“为一件事使用存储过程”倾向于“不为任何事使用EF(表访问)”

var userByID = new Func<User, bool>(x => x.UserId.Equals(userID, StringComparison.InvariantCultureIgnoreCase));
var user = this._context.Users
    .Include("TeamsUsers.Team.TeamsRoles.Role.RolesAreasPermissions.AreaPermission.Area")
    .Include("TeamsUsers.Team.TeamsRoles.Role.RolesAreasPermissions.AreaPermission.Permission")
    .Single(userByID);
var userByID=newfunc(x=>x.UserId.Equals(UserId,StringComparison.InvariantCultureIgnoreCase));
var user=this.\u context.Users
.Include(“团队用户、团队、团队角色、角色、权限、区域”)
.Include(“团队用户、团队、团队角色、角色、区域权限、权限”)
.Single(userByID);

我没有办法测试这一点,但我认为它应该可以工作:

var result = 
    from user in _context.Users
    where user.Id == userId
    from teamUser in user.TeamUsers
    from teamRole in teamUser.Team.TeamRoles
    from roleAreaPermission in teamRole.Role.RoleAreaPermissions
    select roleAreaPermission.AreaPermission.Area;

我没有办法测试这一点,但我认为它应该有效:

var result = 
    from user in _context.Users
    where user.Id == userId
    from teamUser in user.TeamUsers
    from teamRole in teamUser.Team.TeamRoles
    from roleAreaPermission in teamRole.Role.RoleAreaPermissions
    select roleAreaPermission.AreaPermission.Area;

谢谢David,只做了一点修改,看起来效果不错。我仍然很好奇是否可以避免返回中间实体(包括用户),以及如何使用方法语法。@JoeBrockhaus查询只返回
select
语句中的内容,因此它只返回
区域
@JoeBrockhaus您可以使用
SelectMany
的方法语法编写此查询,但我认为这看起来很奇怪,可读性更高。这是我最初的想法(re:select),但当我在图形中导航时,所有依赖实体都被水合,我已经关闭了惰性加载。谢谢David,只做了一点修改,似乎效果很好。我仍然很好奇是否可以避免返回中间实体(包括用户),以及如何使用方法语法。@JoeBrockhaus查询只返回
select
语句中的内容,因此它只返回
区域
@JoeBrockhaus您可以使用
SelectMany
的方法语法编写此查询,但我认为这看起来很奇怪,可读性更高。这是我最初的想法(re:select),但当我在图形中导航时,所有依赖实体都被水合,我已经关闭了惰性加载。