我试图找出如何在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表达式包含对与不同上下文关联的查询的引用。
答案 0 :(得分:1)
它说MemberManager
和Db
是不同的对象。它必须查询一个并将结果传递给另一个以便创建这个函数(想象一下,如果它们指向不同的数据库),并且默认情况下它不愿意这样做,因为它经常是一个坏主意。不
简单的选择就是将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
});
如果可以的话,最好避免这种情况,因为它是两个独立的服务器调用。但它确实允许你使用多个上下文。