代码之家  ›  专栏  ›  技术社区  ›  Paul Rowland

将带有GROUPBY子句和/或聚合函数的Sql查询转换为linq to Sql?

  •  0
  • Paul Rowland  · 技术社区  · 15 年前

    我有一个审计登录名的表,我只想提取每个用户的最新登录名,下面的sql完成了这一点。

    如何将sql查询格式化为linq到sql查询?

    SELECT * FROM AuditTable adt1
        inner join UserTable usr
            on adt1.[UserName] = usr.[User_Id]
    WHERE [TimeStamp] = ( SELECT MAX([TimeStamp])
                          FROM AuditTable adt2
                          WHERE adt1.UserName = adt2.UserName)
    

    用sql编写查询的另一种方法是:;

    SELECT adt1.[UserName], usr.First_Name, max([TimeStamp]) as [TimeStamp]
    FROM AuditTable adt1
        INNER JOIN UserTable usr
            on adt1.[UserName] = usr.[User_Id]
    GROUP BY adt1.[UserName] ,usr.First_Name
    
    2 回复  |  直到 15 年前
        1
  •  2
  •   KristoferA    15 年前

    问题2:
    来自dc.AuditTable中的adt1
    在adt1.UserName==usr.UserID上的dc.UserTable中加入usr

    选择新{UserName=ag.Key,TSMax=ag.Max(ts=>adt1.TimeStamp)}

        2
  •  0
  •   Paul Rowland    15 年前

    我让它工作了。。。答案是使用let关键字。

    作为旁白,我强烈建议使用 LinqPad 当你试图解决这些问题的时候。

    from adt in AuditTable
        join usr in UserTable
            on adt.UserName equals usr.User_Id
    group adt by 
        new { adt.UserName, adt.Roles, usr.First_Name, usr.Last_Name } 
    into g
    let LastAccessed = g.Max(a => a.TimeStamp)
    select new 
        { UserName = g.Key.UserName,
          Roles = g.Key.Roles,
          FirstName = g.Key.First_Name,
          LastName = g.Key.Last_Name,
          TimeStamp = LastAccessed
        }