将具有多个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来说相当新。

将具有多个GroupBy列的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()
  } );