对此感到抱歉 - 我是实体框架的新手,我在其他任何地方都没有找到答案。
我有2个表,用户和角色,有多对一的关系。
使用SQL获取用户角色名称我会这样做:
SELECT r.Name
FROM Role r
INNER JOIN User u ON u.RoleID = r.ID
WHERE u.UserName = 'someusername'
所以在EF中,我认为我应该能够做到这样的事情:
string role = context.Users.Single(u => u.UserName == username).Role.Name;
这很好用,但是当代码运行时,它会在SQL服务器上执行2个查询 - 一个用于从用户表中获取用户,另一个用于从角色表中获取角色。与上面的SQL代码相比,这看起来非常沉重,所以我想知道如何使它更高效并在单个查询中执行。
由于
答案 0 :(得分:1)
如果没有看到你的模型,告诉它是否正确有点棘手,但你可以在1个查询中做到这一点,如下所示:
string role = context.Users.Where(u => u.Username == username).Select(u => u.Role.Name).FirstOrDefault();
在调用FirstOrDefault
之前,代码不会运行任何SQL。
在您的方案中,通过调用Single
,您正在SQL中执行用户名检查,然后其他属性正在延迟加载。