使用Entity Framework 5生成查找不恰当地重复每行查询

时间:2014-04-26 17:21:22

标签: c# entity-framework-5

学习EF5。我有一个UserRole表,用于存储用户角色关系,UserID列,FK到User表,以及一个FK到Role表的RoleID列。

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

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

var userRoles = cx.Users.ToLookup(
    o => o.UserID, 
    o => o.Roles.Select(r => r.RoleID));

导致EF为每个用户执行查询。

我真的希望直接访问UserRole表来生成查找。但是,除非这样,我应该如何编写此代码以获得更好的预测 - 即,只返回一个SQL语句返回的数据?

1 个答案:

答案 0 :(得分:0)

我会发布答案,而不是删除它,以防它可以帮助别人。或者也许有人会发布改进或更正。

此表达式使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<string, string>,因为LINQ投影不会理解这一点。

作为参考,如何将EF的SQL推入单元测试的输出中以引人注目 -

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

可以通过关联的.tt文件持久地包含在生成的代码中。