代码之家  ›  专栏  ›  技术社区  ›  Peter Smith

使用Min和Max函数将SQL转换为LINQ

  •  0
  • Peter Smith  · 技术社区  · 10 月前

    我有以下SQL片段,我正试图将其转换为LINQ查询,作为更复杂查询的一部分,但我不知道如何开始:

    SELECT
        AT.PrimaryIDChanged AS PID,
        MAX(AT.ProcessID) AS EventTypeID,
        MIN(AT.AuditDateTime) AS EventDate
    FROM
        dbo.AuditTrail AS AT    
    WHERE
        AT.AuditTargetTableID = 13
        AND AT.ProcessID IN (30, 31)
    GROUP BY
        AT.PrimaryIDChanged 
    

    目标是EF6。 我还没有代码可以共享

    2 回复  |  直到 10 月前
        1
  •  2
  •   Charlieface    10 月前

    您可以在查询语法中这样做:

    var data =
        from at in context.AuditTrail
        where at.AuditTargetTableID == 13
           && new[]{ 30, 13 }.Contains(at.ProcessID)
        group at by at.PrimaryIDChanged into g
        select new {
            PID = g.Key,
            EventTypeID = g.Max(at => at.ProcessID),
            EventDate = g.Min(at => at.AuditDateTime),
        };
    

    请注意 into g ,这允许您在整个组上执行多个聚合功能。

        2
  •  2
  •   Dave Cousineau    10 月前

    粗略地

    var processIDs = new[] { 30, 31 };
    
    var results =
       context
       .AuditTrail
       .Where(at => at.AuditTargetTableID == 13)
       .Where(at => processIDs.Contains(at.ProcessID))
       .GroupBy(at => at.PrimaryIDChanged)
       .Select(g => new {
          PID = g.Key,
          EventTypeID = g.Max(at => at.ProcessID),
          EventDate = g.Min(at => at.AuditDateTime)
       });
    

    GroupBy 给你一个 IQueryable<IGrouping<TKey, TSource>> 其中 IGrouping 是一个 IEnumerable<TSource> 但也有一个 Key 类型的属性 TKey 。换句话说,你得到了一个可枚举的可枚举数,每个内部可枚举数都有一个键。然后,您可以将这些组中的每一个投影到其他内容中。

    注意,我还没有针对实际的模型测试过这个代码,因为我没有一个atm。