2

我敢肯定,我可以得到我从一个单一的LINQ声明想要的结果,我只是不能由我自己找到它!这是我到目前为止有:的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 
     }; 

预期结果: Expected Results

,这是不正确的,即使我并不真的需要有用户ID在“角色”列表/ IEnumerable的,只是每个UserId的角色名称列表。

我使用asp.net成员SQL表,基本上我想获得用户包括他们的角色的列表。

  • 每个用户可能有多个角色。
  • 用户可能根本没有作用(应该仍然显示在结果)

能否请你帮我或点我就如何从一个单一的LINQ的声明相同的结果正确的方向?

PS。是的,我是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表中添加了信息,与Aspnet_Users的关系为1:1)

回答

1

我相信这是等同的。

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

看看是否能解决问题。

+0

我得到:“'userRole'这个名字不在'equals'左边的范围内,考虑交换'equals'两边的表达式。 – qbantek 2010-11-07 00:47:48

+0

如果我换,我得到了表达:“这个名字‘用户’是不是在范围上的‘等于’左侧考虑交换上的‘等于’两边的表情。” – qbantek 2010-11-07 00:48:33

+0

啊,是的,我的错误,我试图保持它的可读性,并改变我可能不应该有的东西。 groupby将'userRole'带出范围。 – 2010-11-07 00:53:15