Linq很多关系加入

时间:2014-11-09 05:18:24

标签: c# linq entity-framework linq-to-sql

我有4个表,UserCredentialUserProfileUserRolesRole

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();

UserRoleUserIdRoleId,因此用户可以拥有多个角色。

上述代码生成的查询似乎效率不高。任何人都可以建议更好的代码

1 个答案:

答案 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();