Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ:来自PostgreSql的字符串_agg的等价项_C#_Entity Framework_Linq_Npgsql - Fatal编程技术网

C# LINQ:来自PostgreSql的字符串_agg的等价项

C# LINQ:来自PostgreSql的字符串_agg的等价项,c#,entity-framework,linq,npgsql,C#,Entity Framework,Linq,Npgsql,我需要将多个列值连接到单个值(例如,用coma分隔)。我可以通过PostgreSql中的用户string_agg(u.name,,')来实现。我试着用linq查询语法来做,但失败了——我一直只得到带有拆分值的列表,而不是在一个字段中串联值的一行 假设我只有三张表: Doc User Doc_User +----+--------------------+ +----+-----------+ +---

我需要将多个列值连接到单个值(例如,用coma分隔)。我可以通过PostgreSql中的用户
string_agg(u.name,,')来实现。我试着用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
EF无法识别
string.Join()
,我无法在linq查询中使用它,
Aggregate()
也无法工作。我怎样才能做到这一点


我已经准备好了一个示例来使用它:.

下面的代码
使用
LINQ
按路径对公共文档进行分组,然后使用
string.Join
连接分组文档的用户名。我还认为在这一行中不需要
ToList()
选择新的数据模型(){DocPath=d.Path,UserName=u.Name})如果您打算使用此解决方案,因为我们将再次使用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)));
}

您使用哪个提供程序访问带有EF的postgresql(如Devart等)?@evk我使用Npgsql 3.1.9。0@GertArnold我很快就会解决:)