我已经通过一些例子将数据表转换为列表。我使用此代码:
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。
答案 0 :(得分:2)
这假设roles
是Role表生成的LINQ生成类的实例。如果出于某种原因无法在代码中使用LINQ,只需将其更改为Activator.CreateInstance
和Field<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。