学习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语句返回的数据?
答案 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文件持久地包含在生成的代码中。