从EF6中的多对多连接表返回一列

Pre*_*ott 1 c# entity-framework entity-framework-6

我需要在EF6中以多对多的关系从连接表中返回单个列

User { Id, Name}
Role { Id, Role}
UserToRole { UserId, RoleId}
Run Code Online (Sandbox Code Playgroud)

这是一个简化的示例,但我需要从User获取RoleId(Role.Id)的列表.

理想情况下,我只是做类似的事情

context.UserToRole.Where(x => x.UserId == id).Select(r => r.RoleId).ToList();
Run Code Online (Sandbox Code Playgroud)

但EF似乎并没有为我提供该连接表作为查询对象.

我知道我可以将所有角色作为对象拉下来,但在我的实际系统中,这是一个宽表,我想避免将所有数据拉到线上并将其放入内存的开销.

oct*_*ccl 5

如果只需要RolesIdfrom,则User可以执行此查询:

 int userId=1;
 var roleIds = db.Users.Where(u => u.Id == userId).SelectMany(u => u.Roles.Select(a=>a.Id));
Run Code Online (Sandbox Code Playgroud)

这将生成一个像这样的SQL查询:

 {SELECT [Extent1].[Role_Id] AS [Role_Id]
  FROM [dbo].[UserRoles] AS [Extent1]
  WHERE [Extent1].[User_Id] = @p__linq__0}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,是您查找的查询.