【问题标题】:Join on Identity and Another Table加入身份和另一个表
【发布时间】:2015-12-28 23:02:48
【问题描述】:

我试图弄清楚如何在 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 表达式包含对与不同上下文关联的查询的引用。

【问题讨论】:

    标签: c# asp.net-mvc-5 entity-framework-6 asp.net-identity


    【解决方案1】:

    这是说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
            });
    

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

    【讨论】:

      猜你喜欢
      • 2016-08-11
      • 2014-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多