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# 如何使用LINQ查询扁平化包含集合的SQL联接?_C#_Linq_Linq To Sql_Linq To Entities - Fatal编程技术网

C# 如何使用LINQ查询扁平化包含集合的SQL联接?

C# 如何使用LINQ查询扁平化包含集合的SQL联接?,c#,linq,linq-to-sql,linq-to-entities,C#,Linq,Linq To Sql,Linq To Entities,假设我有两个表:用户和用户角色: Users: +----+ | Id | +----+ | 1 | | 2 | | 3 | +----+ UserRoles: +--------+----------+ | UserId | Name | +--------+----------+ | 1 | A | | 1 | B | | 2 | A | | 3 | C | +--------+-

假设我有两个表:用户和用户角色:

Users:
+----+
| Id |
+----+
|  1 |
|  2 |
|  3 |
+----+

UserRoles:
+--------+----------+
| UserId | Name     |
+--------+----------+
|      1 | A        |
|      1 | B        |
|      2 | A        |
|      3 | C        |
+--------+----------+
我需要能够将上述数据选择到如下所示的用户对象列表中:

class User
{
   public int Id { get; set; }
   public List<string> Roles { get; set; }
}
类用户
{
公共int Id{get;set;}
公共列表角色{get;set;}
}
我能想到的最好的方法是以下内容,但它最终会生成一个嵌套的select语句,我不知道这是否会影响性能:

List<Device> usersWithRoles = from user in Users
   select new Device
   {
      Id = user.Id,
      Roles = (from role in UserRoles where role.UserId == user.Id select role.Name).ToList()
   }.ToList();
List usersWithRoles=来自用户中的用户
选择新设备
{
Id=user.Id,
Roles=(来自UserRoles中的角色,其中role.UserId==user.Id选择role.Name)
}.ToList();
有没有更好(更有效的方法)来实现这一点?例如,对于join,我的想法是这样的,但不知道如何从join中填充角色:

List<Device> usersWithRoles = from user in Users
   join user_role in UserRoles on user.Id equals user_role.UserId
   select new Device
   {
      Id = user.Id,
      Roles = ??? // how do I populate this
   }.ToList();
List usersWithRoles=来自用户中的用户
在用户上的用户角色中加入用户角色。Id等于用户角色。用户Id
选择新设备
{
Id=user.Id,
角色=???//如何填充此角色
}.ToList();

谢谢。

使用
GroupJoin
LINQ-to-SQL方法:

List<Device> usersWithRoles = from user in Users
   join user_role in UserRoles on user.Id equals user_role.UserId into roles
   select new Device
   {
      Id = user.Id,
      Roles = roles.ToList()
   }.ToList();
List usersWithRoles=来自用户中的用户
在用户上的用户角色中加入用户角色。Id等于用户角色。用户Id加入角色
选择新设备
{
Id=user.Id,
Roles=Roles.ToList()
}.ToList();

您正在使用EF吗?如果是这种情况,则应通过UserRole关系在用户及其关联角色之间创建关系。这是EF的一个基本部分,它可以轻松处理,因此您不必处理复杂的分组或连接逻辑。@silkfire我使用的是EF。问题是有一堆没有外键定义的遗留表,并且无法触及DB。此外,这只是更大查询的一小部分。我假设您建议我可以使用导航属性执行类似Roles=user.Roles这样的操作?没错。所以你不能访问数据库本身?我会尝试在您的数据层中使用经典SQL+LINQ。在LINQ to SQL中,可以通过在
join
上使用
into
来创建
GroupJoin
。非常酷,“into”是我缺少的部分(尽管在将其分配给角色时,我仍然必须在角色上调用“ToList()”。@ternal21抱歉,是的,这是因为类中的
角色类型。