LINQ:相当于来自 PostgreSql 的 string_agg
LINQ: equivalent for string_agg from PostgreSql
我需要将多个列值连接成单个值(例如用逗号分隔)。我可以在 PostgreSql 中通过 string_agg(u.name, ',') as Users
来完成。我尝试在 linq 查询语法中执行此操作,但我失败了 - 所有时间我只获得包含拆分值的列表,而不是在一个字段中连接值的一行。
假设我只有三个表:
Doc User Doc_User
+----+--------------------+ +----+-----------+ +----+-----------+
| Id | Path | | Id | Name | | DocId | UserId |
+----+--------------------+ +----+-----------+ +----+-----------+
| 1 | "C:\Files\A.txt" | | 1 | "Adam" | | 1 | 1 |
| 2 | "C:\Files\B.txt" | | 2 | "Benny" | | 1 | 2 |
| 3 | "C:\Files\C.txt" | | 3 | "Charlie" | | 2 | 1 |
+----+--------------------+ +----+-----------+ | 2 | 2 |
| 2 | 3 |
+-------+--------+
一开始我尝试简单连接:
var model = (from d in db.Docs
join du in db.DU on d.Id equals du.DocId
join u in db.Users on du.UserId equals u.Id
select new DataModel() { DocPath = d.Path, UserName = u.Name }).ToList();
正如我所怀疑的那样,我得到了分隔行的列表:
C:\Files\A.txt | Adam
C:\Files\A.txt | Benny
C:\Files\B.txt | Adam
C:\Files\B.txt | Benny
C:\Files\B.txt | Charlie
但是我想得到的是:
C:\Files\A.txt | Adam, Benny
C:\Files\B.txt | Adam, Benny, Charlie
string.Join()
无法被 EF 识别,我不能在 linq 查询中使用它,Aggregate()
也不起作用。我怎样才能做到这一点?
我已经准备好使用它的示例:.Net Fiddle。
下面的代码 groups
使用 LINQ
按路径划分的公共文档,然后使用 string.Join
加入分组文档的用户名。我还认为,如果您要使用此解决方案,则不需要在这一行 select new DataModel() { DocPath = d.Path, UserName = u.Name }).ToList();
中添加 ToList()
,因为我们将再次使用 LINQ。
var grouped = model.GroupBy(x => x.DocPath);
foreach (var iGrouped in grouped){
string.Join(",",iGrouped.Select(x => x.UserName));
Console.WriteLine(iGrouped.Key + " | " + string.Join(",",iGrouped.Select(x => x.UserName)));
}
我需要将多个列值连接成单个值(例如用逗号分隔)。我可以在 PostgreSql 中通过 string_agg(u.name, ',') as Users
来完成。我尝试在 linq 查询语法中执行此操作,但我失败了 - 所有时间我只获得包含拆分值的列表,而不是在一个字段中连接值的一行。
假设我只有三个表:
Doc User Doc_User
+----+--------------------+ +----+-----------+ +----+-----------+
| Id | Path | | Id | Name | | DocId | UserId |
+----+--------------------+ +----+-----------+ +----+-----------+
| 1 | "C:\Files\A.txt" | | 1 | "Adam" | | 1 | 1 |
| 2 | "C:\Files\B.txt" | | 2 | "Benny" | | 1 | 2 |
| 3 | "C:\Files\C.txt" | | 3 | "Charlie" | | 2 | 1 |
+----+--------------------+ +----+-----------+ | 2 | 2 |
| 2 | 3 |
+-------+--------+
一开始我尝试简单连接:
var model = (from d in db.Docs
join du in db.DU on d.Id equals du.DocId
join u in db.Users on du.UserId equals u.Id
select new DataModel() { DocPath = d.Path, UserName = u.Name }).ToList();
正如我所怀疑的那样,我得到了分隔行的列表:
C:\Files\A.txt | Adam
C:\Files\A.txt | Benny
C:\Files\B.txt | Adam
C:\Files\B.txt | Benny
C:\Files\B.txt | Charlie
但是我想得到的是:
C:\Files\A.txt | Adam, Benny
C:\Files\B.txt | Adam, Benny, Charlie
string.Join()
无法被 EF 识别,我不能在 linq 查询中使用它,Aggregate()
也不起作用。我怎样才能做到这一点?
我已经准备好使用它的示例:.Net Fiddle。
下面的代码 groups
使用 LINQ
按路径划分的公共文档,然后使用 string.Join
加入分组文档的用户名。我还认为,如果您要使用此解决方案,则不需要在这一行 select new DataModel() { DocPath = d.Path, UserName = u.Name }).ToList();
中添加 ToList()
,因为我们将再次使用 LINQ。
var grouped = model.GroupBy(x => x.DocPath);
foreach (var iGrouped in grouped){
string.Join(",",iGrouped.Select(x => x.UserName));
Console.WriteLine(iGrouped.Key + " | " + string.Join(",",iGrouped.Select(x => x.UserName)));
}