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

时间:2017-03-22 14:11:37

标签: c# entity-framework linq

我有一个表用户,还有一个表Phone。

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

|   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        |

我正在使用Linq和Entity Framework 6。我的查询看起来像这样:

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

1 个答案:

答案 0 :(得分:0)

您可以按名称和聚合进行分组,但我会在内存中进行分组,因为它不会通过EF转换为SQL。此外,您应该使用Phones导航属性,而不是在电话桌上进行子查询。

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