C# 使用实体Framork 5生成查找时,每行不适当地重复查询

C# 使用实体Framork 5生成查找时,每行不适当地重复查询,c#,entity-framework-5,C#,Entity Framework 5,学习英语五级。我有一个存储用户角色关系的UserRole表,其中一个UserID列FKs到一个用户表,另一个RoleID列FKs到一个角色表 从数据库生成的Edmx拒绝将此UserRole表生成到设计器中,因为它在用户和角色表中为我提供了“导航”属性以获取此关系信息。。。这很好 但是我尝试为身份验证缓存生成查找的第一个查询(cx是DbContext) 使EF为每个用户执行查询 我真的更愿意直接访问UserRole表来生成查找。但是,除此之外,我应该如何编写此代码以获得更好的投影-即,只返回一条S

学习英语五级。我有一个存储用户角色关系的UserRole表,其中一个UserID列FKs到一个用户表,另一个RoleID列FKs到一个角色表

从数据库生成的Edmx拒绝将此UserRole表生成到设计器中,因为它在用户和角色表中为我提供了“导航”属性以获取此关系信息。。。这很好

但是我尝试为身份验证缓存生成查找的第一个查询(
cx
是DbContext)

使EF为每个用户执行查询


我真的更愿意直接访问UserRole表来生成查找。但是,除此之外,我应该如何编写此代码以获得更好的投影-即,只返回一条SQL语句的数据?

我将发布答案,而不是删除它,以防它可以帮助其他人。或者可能有人会发布改进或更正

此表达式使EF使用单个SQL语句检索数据

var userRoles = cx.Users.SelectMany(u => 
    u.Roles.Select(r => 
        new { userID = u.UserID, roleID = r.RoleID })).
    ToLookup(o => o.userID, o => o.roleID);
这里必须使用匿名类型,而不是
KeyValuePair
,因为LINQ投影无法理解这一点

作为参考,如何将EF的SQL推送到单元测试的输出中,以吸引它的眼球-

public YourDatabaseNameEntities()
    : base("name=YourDatabaseEntities")
{
#if TRACE
    this.Database.Log = s => System.Diagnostics.Trace.WriteLine(s);
#endif
}
它可以通过相关的.tt文件持久地包含在生成的代码中

public YourDatabaseNameEntities()
    : base("name=YourDatabaseEntities")
{
#if TRACE
    this.Database.Log = s => System.Diagnostics.Trace.WriteLine(s);
#endif
}