在标识和另一个表上联接

本文关键字:另一个 标识 | 更新日期: 2023-09-27 18:28:22

我正试图弄清楚如何在Identity和我拥有的另一个表(在本例中为TeamMember)上创建联接语句。

以下是我尝试过的:

var j =
    Db.TeamMembers.Join(MemberManager.Users,
    c => c.MemberId,
    cm => cm.Id,
    (c, cm) => new {TeamMember = c, Member = cm})
    .Where(m => m.TeamMember.TeamId == team.Id && !m.TeamMember.MemberId.Equals(team.CaptainId));
List<TeamMember> teamMembers = new List<TeamMember>();
foreach (var result in j)
{
    var teamMember = new TeamMember
    {
        GameDisplayName = result.Member.Alias
    };
    teamMembers.Add(teamMember);
}

我的错误是

指定的LINQ表达式包含对与不同上下文关联的查询的引用。

描述:在执行当前web请求期间发生未处理的异常。请查看堆栈跟踪以了解有关错误以及错误在代码中的来源的更多信息。

异常详细信息:System.NotSupportedException:指定的LINQ表达式包含对与不同上下文关联的查询的引用。

在标识和另一个表上联接

据说MemberManagerDb是不同的对象。它必须查询其中一个并将结果传递给另一个才能生成此函数(想象一下,如果它们指向不同的数据库),但默认情况下它不愿意这样做,因为这通常是个坏主意。

简单的选项就是将MemberManager.Users更改为Db.Users。如果我正确理解你的设置,那应该可以修复它。

也就是说,我根本不明白MemberManager为什么存在,所以也许我不明白。在这种情况下,你必须做这样的事情:

var team = /*...*/;
var teamMembers = Db.TeamMembers
    .Where(c => c.TeamId == team.Id && c.MemberId != team.CaptainId)
    .ToList();
var teamMemberIds = teamMembers.Select(c => c.MemberId);
var members = MemberManager.Users
    .Where(c => teamMemberIds.Any(x => c.Id == x))
    .ToList();
var j = teamMembers
    .Join(members, c => c.MemberId, cm => cm.Id, (c, cm) => new
        {
            TeamMember = c,
            Member = cm
        });

如果可以的话,最好避免这种情况,因为这是两个独立的服务器调用。但它确实允许您使用多个上下文。