Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.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#_Entity Framework_Linq - Fatal编程技术网

C# 是否可以在实体框架中将联接聚合为逗号分隔的列表

C# 是否可以在实体框架中将联接聚合为逗号分隔的列表,c#,entity-framework,linq,C#,Entity Framework,Linq,我有一个桌上用户和一个桌上电话 一个用户可以有多个电话号码。因此,连接的返回可能如下所示: | name | phonenr | |----------|-------------| | Eve | 00123 | | Eve | 00145 | | Eve | 00125 | | Eve | 00245 | | Bob | 00147 | | Bob | 0

我有一个桌上用户和一个桌上电话

一个用户可以有多个电话号码。因此,连接的返回可能如下所示:

|   name   |  phonenr    |
|----------|-------------|
|  Eve     |  00123      |
|  Eve     |  00145      |
|  Eve     |  00125      |
|  Eve     |  00245      |
|  Bob     |  00147      |
|  Bob     |  00159      |
|  Bob     |  00258      |
|   name   |          phonenr            |
|----------|-----------------------------|
|  Eve     |  00123, 00145, 00125, 00245 |
|  Bob     |  00147, 00159, 00258        |
(from user in context.Users
 orderby user.Id
 select new User{
     id = user.id,
     name = user.name,
     phonenr = (from nr in context.Phone
                where nr.userid.Equals(user.id)
                select nr.Number).ToList()
}).ToList();
但是,这会创建许多类似的行,因为用户可以有很多行。是否可以返回如下内容:

|   name   |  phonenr    |
|----------|-------------|
|  Eve     |  00123      |
|  Eve     |  00145      |
|  Eve     |  00125      |
|  Eve     |  00245      |
|  Bob     |  00147      |
|  Bob     |  00159      |
|  Bob     |  00258      |
|   name   |          phonenr            |
|----------|-----------------------------|
|  Eve     |  00123, 00145, 00125, 00245 |
|  Bob     |  00147, 00159, 00258        |
(from user in context.Users
 orderby user.Id
 select new User{
     id = user.id,
     name = user.name,
     phonenr = (from nr in context.Phone
                where nr.userid.Equals(user.id)
                select nr.Number).ToList()
}).ToList();
不过我使用的是Linq和实体框架6。我的查询如下所示:

|   name   |  phonenr    |
|----------|-------------|
|  Eve     |  00123      |
|  Eve     |  00145      |
|  Eve     |  00125      |
|  Eve     |  00245      |
|  Bob     |  00147      |
|  Bob     |  00159      |
|  Bob     |  00258      |
|   name   |          phonenr            |
|----------|-----------------------------|
|  Eve     |  00123, 00145, 00125, 00245 |
|  Bob     |  00147, 00159, 00258        |
(from user in context.Users
 orderby user.Id
 select new User{
     id = user.id,
     name = user.name,
     phonenr = (from nr in context.Phone
                where nr.userid.Equals(user.id)
                select nr.Number).ToList()
}).ToList();

您可以按名称和聚合进行分组,但我会在内存中这样做,因为它不会通过EF转换为SQL。另外,您应该有一个
Phones
导航属性,您可以使用它来代替对phone表进行子查询

var results = (from user in context.Users
               from phone in user.Phones
               orderBy user.Id
               group phone.Number by user into g
               select new {
                   g.Key.Id,
                   g.Key.Name,
                   Phones = g.ToList()})
              .AsEnumerable()
              .Select(x => new User{
                   Id = x.Id,
                   Name = x.Name,
                   Phones = string.Join(",", x.Phones)})
              .ToList();

您可以按名称和聚合进行分组,但我会在内存中这样做,因为它不会通过EF转换为SQL。另外,您应该有一个
Phones
导航属性,您可以使用它来代替对phone表进行子查询

var results = (from user in context.Users
               from phone in user.Phones
               orderBy user.Id
               group phone.Number by user into g
               select new {
                   g.Key.Id,
                   g.Key.Name,
                   Phones = g.ToList()})
              .AsEnumerable()
              .Select(x => new User{
                   Id = x.Id,
                   Name = x.Name,
                   Phones = string.Join(",", x.Phones)})
              .ToList();

EF没有给你一个
Phones
导航属性,你可以用它来代替子查询吗?有点像。但是,当我查看执行到DB的查询时,它仍然会因此产生大量混乱。请记住,这是一个简单的查询,只是作为我的文章的一个示例。真正的查询有大量这样的列表。因此,当我通常得到大约30个项目时,它最终仍然会生成5000多个结果,因为所有这些列表Doesn-EF不会给你一个
Phones
navigation属性,你可以用它来代替那种子查询。但是,当我查看执行到DB的查询时,它仍然会因此产生大量混乱。请记住,这是一个简单的查询,只是作为我的文章的一个示例。真正的查询有大量这样的列表。所以当我通常得到大约30个项目时,由于所有这些列表,它最终仍然会生成5000多个结果。你为什么要按电话号码分组?@EhsanSajjad它是按用户对电话号码进行分组。好的。。现在说得通了,从来没有想过可以这样做。问题是,这不会转换为SQL。因此,数据库的响应仍然非常复杂slow@user2657943我怀疑一个可以进行字符串操作的sql查询会更快。你为什么要对电话号码进行分组?@EhsanSajjad它是根据用户对电话号码进行分组。好的。。现在说得通了,从来没有想过可以这样做。问题是,这不会转换为SQL。因此,数据库的响应仍然非常复杂slow@user2657943我怀疑执行字符串操作的sql查询会更快