没有Aggregate函数的C#Linq2Sql-GroupBy



我有下表

Login  Permission
user1      A      
user1      B      
user2      A      
user2      B      

我想要以下输出:

user1 A,B
user2 A,B

为此,我使用GroupBy方法

var results = (from p in  _dbContext.Users
               group p by new { p.Login } into g
                select new { Login = g.Key.Login, 
                             Permissions = string.Join(",", g.Select(x => x.Permission)).ToList()

但是如果没有任何聚合函数,则给定的代码将失败。如何修复?

没有标准的SQL方法将字符串连接为分组函数,因此在Linq2Sql中不支持这样做。

但是,您可以使用内存中的Linq,方法是使用AsEmumerable()将处理从Linq2Sql切换到内存中的Linq:

var results = (from p in  _dbContext.Users.AsEnumerable()
               group p by new { p.Login } into g
               select new { Login = g.Key.Login, 
                         Permissions = string.Join(",", g.Select(x => x.Permission)).ToList();

请注意,这会将整个Users表拉入内存,以便进行连接,但除非用户表很大,否则这应该不是一个大问题。如果,那么您可以查看一些SQL技巧来进行字符串连接,并将其转换为存储过程以从Linq调用,或者传入自定义SQL查询。但是,单凭Linq功能是无法做到这一点的。

最新更新