我有一个表用户,还有一个表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();
答案 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();