我有4个表,UserCredential
,UserProfile
,UserRoles
和Role
var user = (from uc in Db.UserCredentials
join up in Db.UserProfiles on uc.UserId equals up.UserId
join ur in Db.UserRoles on uc.UserId equals ur.UserId
select new {
Credetial = uc,
Profile = up,
Roles = Db.Roles.Where(r => r.RoleId == ur.RoleId)})
.FirstOrDefault();
UserRole
有UserId
和RoleId
,因此用户可以拥有多个角色。
上述代码生成的查询似乎效率不高。任何人都可以建议更好的代码
答案 0 :(得分:0)
首先,由于我们担心性能,请确保您的数据库在所有UserId和RoleId列上都有索引。
由于您有多个UserRoles,包括它在连接中浪费地增加了查询的基数,然后随后调用FirstOrDefault将其拉回到一个。一?你还没有看到你如何选择一个特定的用户,但是我会把它留给你解决,除非它在你的一个数据源中被过滤。
此外,您的匿名对象上的roles属性:每次触摸它时,您将访问数据库。这很可能是性能问题的根源。如果缓存该信息是可以接受的,那么使用ToList()调用完成子查询将是谨慎的。
该子查询本身可能是另一个麻烦来源,特别是如果使用ToList - 它将是另一次访问数据库,因此请确保将主查询的基数保持在较低水平以控制行程次数。
var user = (from uc in Db.UserCredentials
join up in Db.UserProfiles on uc.UserId equals up.UserId
//where uc.UserId == somePassedInUserId /* add this line if your datasources aren't filtered */
select new {
Credetial = uc,
Profile = up,
Roles = (from ur in Db.UserRoles join r in Db.Roles on ur.RoleId equals r.RoleId
where ur.UserId == uc.UserId select r).ToList()
.FirstOrDefault();