C# LINQ:来自PostgreSql的字符串_agg的等价项
我需要将多个列值连接到单个值(例如,用coma分隔)。我可以通过PostgreSql中的用户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 +----+--------------------+ +----+-----------+ +---
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我很快就会解决:)