2014-10-29 47 views
-1

我有下面的C#代码在做一个LINQ加入C#

List<User> users = User.FindAll(); 
List<Role> roles = Role.FindAll(); 

这些自定义安全相关的对象。在两个对象的属性如下所示:

User      Role 
----      ---- 
UserId      RoleId 
UserName     RoleName 
RoleIds 

我试图让创建一个新的用户对象,这将使我为每个用户RoleIds和角色名。基本上,我想要一个新的用户对象,看起来像这样:

User 
---- 
UserId 
UserName 
Roles (RoleId, RoleName) 

我需要在内存中执行此操作。目前,我有以下几点:

var results = (from user in users 
       select new 
       { 
       UserId = user.UserId, 
       UserName = user.UserName, 
       }); 

不过,我不知道如何添加Roles属性使得仅与每个用户相关的角色列表都包括在内。我不知道如何加入roles变量。有没有办法与LINQ做到这一点?如果是这样,怎么样?

+1

您是否甚至可以使用谷歌LINQ加入? – DLeh 2014-10-29 13:34:55

+1

'RoleIds'如何存储在用户表中?这可能是更多的体系结构问题...... – 2014-10-29 13:39:23

回答

2

使用Where

var results = (from user in users 
      select new 
      { 
      UserId = user.UserId, 
      UserName = user.UserName, 
      Roles = roles.Where(r => user.RoleIds.Contains(r.RoleId)).ToList() 
      }); 

这假定RoleIds实际上含有RoleIds阵列。如果情况并非如此,并且它是一个逗号分隔的RoleIds字符串,那么您首先需要创建一个角色ID数组,然后Contains将具有预期的行为(即,不匹配“1”和“10” ”

+0

如果角色名称中存在数字,此代码将导致问题。 (全部取决于RoleIds的存储方式)例如,假设您的角色列表中有10个角色的Ids为1-10。如果RoleIds字段包含诸如“5,Role1”之类的字符,则角色1和5都满足where子句。或者,如果RoleIds字段包含“10,RoleWhatever”,则它将返回角色1和10. – 2014-10-29 15:50:23

+0

是的,取决于'RoleIds'是什么。我假设一个数组,因为它是复数(即已经连接了一个包含userids和role id的表),但是如果它是一个逗号分隔的字符串,您需要首先'string.split'。 – 2014-10-29 17:23:52

0

你有没有尝试这个办法:

创建一个类

Public Class tblUser 
    { 
    public string UserId {get; set;} 
    public string UserName {get; set;} 
    public string RoleIds {get; set;} 
    public string RoleName {get; set;}     
    } 

var results = (from h in users 
       join n Role on h.RoleIds equal n.RoleId 
       select new tblUser 
        { 
        UserId = h.UserId, 
        UserName = h.UserName, 
        RoleName = n.RoleName 
        } 
       ); 

希望这将有助于!!!!!!

0

我的建议是这样的:重构您的用户/在数据库中的角色关系,以便你有三张桌子。

User 
----- 
UserId 
UserName 


Role 
----- 
RoleId 
RoleName 


UsersInRoles 
----- 
UserId 
RoleId 
IsActive 

然后,在Id列上拥有从UsersInRoles到User和UsersInRoles到Role的外键关系。然后,当您查询时,您可以将所有三个表一起加入以获取必要的信息,如下所示:

var results = (from u in Users 
       join uir in UsersInRoles on u.UserId equals uir.UserId 
       join r in Role on uir.RoleId equals r.RoleId 
       where uir.IsActive 
       select new 
       { 
        UserId = u.UserId, 
        UserName = u.UserName, 
        RoleName = r.RoleName 
       });