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