从数据表创建列表以列出

时间:2015-03-11 08:52:07

标签: c#

我已经通过一些例子将数据表转换为列表。我使用此代码:

foreach (var dataRow in userDetails.AsEnumerable())
{
    TUser user = (TUser)Activator.CreateInstance(typeof(TUser));
    user.Id = dataRow.Field<Guid>("Id");
    user.UserName = dataRow.Field<string>("Username");
    user.Password = dataRow.Field<string>("Password");
    users.Add(user); // Users is list
 }

现在,当我想要包含join的用户角色时,我得到以下结果(因为用户可以有很多角色)。

    Id     | Username       | Password | RoleId | RoleName
-------------------------------------------------------------
    4557   | test@gmail.com | Test     | 2      | Admin
    4557   | tset@gmail.com | Test     | 3      | User

我想将用户详细信息转换为包含角色列表的列表。有没有办法实现此功能?实际上,在实体框架中,它会自动出现。我怎么能这样做?

Class user{
    public int Id {get;set;}
    public int Name{get;set;} etc...
    public List<Role> Roles{get;set;}
}

或者我错误的sql结果?如果是,请提供替代方案。 我使用的是ms-sql。

3 个答案:

答案 0 :(得分:2)

这假设roles是Role表生成的LINQ生成类的实例。如果出于某种原因无法在代码中使用LINQ,只需将其更改为Activator.CreateInstanceField<type>。当然,如果你可以使用LINQ / EF,你可以从userDetails开始使用它们,并跳过所有丑陋的Field<fieldName>

foreach (var dataRow in userDetails.AsEnumerable())
{
                TUser user = (TUser)Activator.CreateInstance(typeof(TUser));
                user.Id = dataRow.Field<Guid>("Id");
                user.UserName = dataRow.Field<string>("Username");
                user.Password = dataRow.Field<string>("Password");

                users.Roles = roles.Where(r=>r.UserId = user.Id)
                             .Select(r=>new Roles(ID=r.RoleId,Name=r.RoleName).ToList()

                users.Add(user); // Users is list
 }

答案 1 :(得分:1)

假设您的DataTable包含您发布的数据,我可能会创建一个继承自List的类Users,并为将获取数据行的Add方法创建一个重载。 在这种方法中,首先要检查用户是否已经存在于集合中。如果没有,您只需创建用户对象并添加它。如果它确实存在,你只需要将此角色添加到该用户(我会测试他是否也没有这个角色)。 由于此类继承了List,因此您可以在代码中使用它,就像使用List一样。

答案 2 :(得分:0)

以下是我使用LINQ和群组的解决方案:

var users = dt.AsEnumerable()
              .GroupBy(r => new 
                 {
                   Id = r["Id"], 
                   Name=r["UserName"], 
                   Password = r["Password"]
                 })
              .Select(g => new User() 
                 {
                   Id = (Guid)g.Key.Id, 
                   Name = g.Key.Name as string, 
                   Password = g.Key.Password as string, 
                   Roles = g.Select(r => new Role() 
                              {
                                Id = (int)r["RoleId"],
                                Name = r["RoleName"] as string
                              })
                          /*.Distinct()*/
                            .ToList()
                 })
              .ToList();

首先,我按用户详细信息创建组。现在每个组都等同于用户。然后我从组中选择新的User个实例。每个组还包含DataRows,我从中提取Role s。