加入身份和另一张表

时间:2015-12-28 23:02:49

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

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

1 个答案:

答案 0 :(得分: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
        });

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