不带聚合函数的C#Linq2Sql GroupBy
我有下表不带聚合函数的C#Linq2Sql GroupBy,c#,linq-to-sql,C#,Linq To Sql,我有下表 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
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
表拉入内存,以便进行连接,但除非您的Users表很大,否则这不会是一个大问题。如果是,那么您可以研究一些SQL技巧来进行字符串连接,或者将其转换为存储过程以从Linq调用,或者传入自定义SQL查询。但是单靠Linq功能是无法做到这一点的。默认情况下,groupby
要求在select
查询中有一个aggregate
函数,但在这种情况下,我不需要任何aggregate
函数,因此SQL的问题就是这样的,那么,您是在使用LINQ to EF 6.x/EF Core 2.0/2.1/3.x/5吗?实际上,LINQ to SQL处理得很好-它通过p.Login
上的query将其转换为SQLGROUP,然后对Select
(x.Permission
)中的列对每个组运行单独的查询。无法翻译的是LINQ到EF 6.x/EF Core 3.x/5。