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查询会更快