我有下表
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功能是无法做到这一点的。