Linq to sql Linq:多个子联接或子查询

Linq to sql Linq:多个子联接或子查询,linq-to-sql,asp.net-membership,subquery,left-join,membership-provider,Linq To Sql,Asp.net Membership,Subquery,Left Join,Membership Provider,我很确定我可以从一个Linq语句中得到我想要的结果,我只是无法自己找到它!这就是我到目前为止所做的: var query = from uir in Aspnet_UsersInRoles join r in Aspnet_Roles on uir.RoleId equals r.RoleId select new { UserId = uir.UserId, RoleName =

我很确定我可以从一个Linq语句中得到我想要的结果,我只是无法自己找到它!这就是我到目前为止所做的:

var query = from uir in Aspnet_UsersInRoles
        join r in Aspnet_Roles
        on uir.RoleId equals r.RoleId 
        select new
        {
            UserId = uir.UserId,
            RoleName = r.RoleName
        };

var query2 = from q in query
        group q by q.UserId into roles
        select new 
        {
            UserId = roles.Key,
            Roles = roles.Distinct()
        };

var query3 = from u in Aspnet_Users
        join q in query2
        on u.UserId equals q.UserId
        select new
        {
            UserId = u.UserId,
            UserName = u.UserName,
            Roles = q.Roles
        };
预期成果:

这甚至是不正确的:我真的不需要在“角色”列表/IEnumerable中有UserId,只需要每个UserId的RoleName列表

我使用的是asp.net成员资格sql表,基本上我想得到一个用户列表,包括他们的角色

  • 每个用户可能有多个角色
  • 用户可能根本没有角色(并且应该仍然显示在结果上)
关于如何从一个Linq语句中获得相同的结果,您能否帮助我或为我指出正确的方向

是的,我是Linq的新手和SQL的老手,这可能会模糊我的想法

编辑

好的,我想我要开始了:

var q = from u in Aspnet_Users
    from up in UserProfiles.Where( _up => _up.UserId == u.UserId ).DefaultIfEmpty()
    from uir in Aspnet_UsersInRoles.Where( _uir => _uir.UserId == u.UserId ).DefaultIfEmpty()
    from r in Aspnet_Roles.Where( _r => _r.RoleId == uir.RoleId).DefaultIfEmpty()
    group r.RoleName by new     {
                                u.UserId, 
                                u.UserName, 
                                up.FirstName, 
                                up.LastName, 
                                u.LastActivityDate
                                } into g
    select new 
    {
        userID = g.Key.UserId,
        firstName = g.Key.FirstName,
        lastName = g.Key.LastName,
        userName = g.Key.UserName,          
        lastActivityDate = g.Key.LastActivityDate,
        roles = g.Distinct()
    };
你觉得怎么样?
(我从我自己的UserProfiles表中添加了信息,1:1关系与Aspnet\u用户)

我认为这是等效的

var query = from userRole in Aspnet_UsersInRoles
            join role in Aspnet_Roles on userRole.RoleId equals role.RoleId 
            group role.RoleName by userRole.UserId into roles
            join user in Aspnet_Users on roles.Key equals user.UserId
            select new
            {
                user.UserId,
                user.UserName,
                Roles = roles.Distinct(),
            };

看看这个是否有效。

我得到:“UsRe角色”的名称不在“相等”的左边。考虑交换“相等”的两边的表达式。“如果我交换表达式,我得到的是:‘用户’的名字不在‘相等’的左边。考虑交换‘相等’的两边的表达式。”啊,是的,我的错误。我试图保持它的可读性,并在我可能不应该改变的地方改变一些事情。groupby将
userRole
排除在范围之外。我没有理解您关于合并的查询是错误的,我更正了这一点。您只想对角色名称进行分组,现在就可以了。