Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中加入LINQ_C#_Linq - Fatal编程技术网

C# 在C中加入LINQ

C# 在C中加入LINQ,c#,linq,C#,Linq,我有下面的C代码 List<User> users = User.FindAll(); List<Role> roles = Role.FindAll(); 我正在尝试创建一个新的用户对象,该对象将为每个用户提供RoleIds和RoleNames。本质上,我想要一个新的用户对象,它将如下所示: User ---- UserId UserName Roles (RoleId, RoleName) 我需要在记忆中这样做。目前,我有以下几点: var results = (

我有下面的C代码

List<User> users = User.FindAll();
List<Role> roles = Role.FindAll();
我正在尝试创建一个新的用户对象,该对象将为每个用户提供RoleIds和RoleNames。本质上,我想要一个新的用户对象,它将如下所示:

User
----
UserId
UserName
Roles (RoleId, RoleName)
我需要在记忆中这样做。目前,我有以下几点:

var results = (from user in users
               select new
               {
                 UserId = user.UserId,
                 UserName = user.UserName,
               });
但是,我不知道如何添加Roles属性,以便只包含与每个用户关联的角色列表。我不知道如何使用roles变量进行连接。有没有办法让LINQ做到这一点?如果是,如何使用?

使用Where

这假设RoleIds实际上是一个包含RoleIds的数组。如果不是这种情况,并且它是一个逗号分隔的RoleID字符串,那么您需要字符串。首先拆分它以创建角色ID数组,然后包含将具有预期的行为,即不匹配1与10。

您尝试过以下方法吗:

创建一个类

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

希望这会有帮助

我的建议是:重构数据库中的用户/角色关系,以便有三个表

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

你有没有google linq加入?RoleIds是如何存储在用户表中的?这可能更像是架构问题……如果角色名称中存在数字,则此代码会导致问题。所有这些都取决于RoleID的存储方式,例如,假设您的角色列表中有10个ID为1-10的角色。如果RoleIds字段包含类似于5,Role1的内容,那么where子句将由角色1和5满足。或者,如果RoleIds字段包含10,RoleWhatever,它将返回角色1和10。是的,取决于RoleIds是什么。我假设一个数组,因为它是复数的,即已经与一个包含用户ID和角色ID的表连接,但如果它是逗号分隔的字符串,则需要先对其进行string.split。
User
-----
UserId
UserName


Role
-----
RoleId
RoleName


UsersInRoles
-----
UserId
RoleId
IsActive
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
               });