在 MVC 6 中具有单一角色的用户列表已加入

List of Users with their single Role in MVC 6 left joined

使用 VS 2015、MVC 6 RC1 和 EF 7 RC1,我正在尝试获取所有用户的列表以及他们的单一角色名称。

我已经尝试了我在 Whosebug 上遇到的所有建议,但 none 奏效了。

我要找的SQL是:

SELECT [User].[Email], [Role].[Name]
FROM [User]
LEFT JOIN [UserRoles] ON [User].[Id] = [UserRoles].[UserId]
LEFT JOIN[Role] ON [UserRoles].[RoleId] = [Role].[Id]

我已经编写了以下内容并在 LinqPad 上进行了测试(工作正常)并且应该在我的项目中工作但出现错误:

var q1 = (from user in _context.Users
          join ur in _context.UserRoles on user.Id equals ur.UserId into grp1
          from fgrp1 in grp1.DefaultIfEmpty()
          join r in _context.Roles on fgrp1.RoleId equals r.Id into grp2
          from fgrp2 in grp2.DefaultIfEmpty()
          select new { UserEmail = user.Email, UserRoleName = fgrp2.Name }).ToList();

错误信息是:

An unhandled exception occurred while processing the request.
InvalidOperationException: Sequence contains no elements
System.Linq.Enumerable.Single[TSource](IEnumerable`1 source)

我不知道这是否有任何区别,但我已经创建了自己的角色实体:

public class ExtranetRole : IdentityRole<int> { }

我自己的用户实体为:

public class ExtranetUser : IdentityUser<int> { }

非常感谢help/suggestions。

EF7 RC1 有一些错误,与 LEFT 连接有关。检查 https://github.com/aspnet/EntityFramework/issues/3629 - 它看起来与您的问题非常相似。

我认为在 EF 发布之前的最佳解决方案是分别读取所有三个表并使用 linq(对象)将它们连接到内存中。保证有效:)