将具有多个GroupBy列的SQL查询转换为LINQ
本文关键字:查询 SQL 转换 LINQ 列的 GroupBy | 更新日期: 2023-09-27 18:12:23
SELECT
[TimeStampDate]
,[User]
,count(*) as [Usage]
FROM [EFDP_Dev].[Admin].[AuditLog]
WHERE [target] = '995fc819-954a-49af-b056-387e11a8875d'
GROUP BY [Target], [User] ,[TimeStampDate]
ORDER BY [Target]
我的数据库表有User、TimeStampDate和Target(这是一个GUID)列。
我想检索每个用户每个日期的所有项目,并显示条目的计数。
上面的SQL查询工作。我如何将其转换为LINQ到SQL?我使用的是EF 6.1,我在c#中的实体类具有上述所有列。
Create Filter基本上返回整个AuditLogSet的一个IQueryable
:
using (var filter = auditLogRepository.CreateFilter())
{
var query = filter.All
.Where(it => it.Target == '995fc819-954a-49af-b056-387e11a8875d')
.GroupBy(i => i.Target, i => i.User, i => i.TimeStamp);
audits = query.ToList();
}
我不被允许在LINQ上3列分组,我也不知道如何选择像上面的SQL查询计数。对LINQ来说相当新。
您需要像这样在anonymous type
中按列指定组:-
var query = filter.All
.Where(it => it.Target == '995fc819-954a-49af-b056-387e11a8875d')
.GroupBy(x => new { x.User, x.TimeStampDate })
.Select(x => new
{
TimeStampDate= x.Key.TimeStampDate,
User = x.Key.User,
Usage = x.Count()
}).ToList();
许多人觉得查询语法更简单,更容易阅读(可能不是这样,我不知道),这里是查询语法版本。
var res=(from it in filter.All
where it.Target=="995fc819-954a-49af-b056-387e11a8875d"
group it by new {it.Target, it.User, it.TimeStampDate} into g
orderby g.Key.Target
select new
{
TimeStampDate= g.Key.TimeStampDate,
User=g.Key.User,
Usage=g.Count()
});
编辑:顺便说一下,您不需要按目标分组,也不需要按OrderBy分组,因为已经过滤了,我将保留查询的确切翻译。
要使用GroupBy,您需要创建一个这样的匿名对象:
filter.All
.Where(it => it.Target == '995fc819-954a-49af-b056-387e11a8875d')
.GroupBy(i => new { i.Target, i.User, i.TimeStamp });
在原始SQL中没有必要按目标分组。
filter.All.Where( d => d.Target == "995fc819-954a-49af-b056-387e11a8875d")
.GroupBy(d => new {d.User ,d.TimeStampDate} )
.Select(d => new {
User = d.Key.User,
TimeStampDate = d.Key.TimeStampDate,
Usage = d.Count()
} );