使用JOIN,GROUP BY,HAVING和MAX的LINQ to SQL

时间:2013-12-19 17:06:19

标签: sql linq linq-to-sql

我正在尝试将此SQL查询转换为LINQ:

SELECT
        T1.FileID,
        MAX(T1.Date) AS MaxDate
FROM    
        T1
        JOIN
        T2 ON T1.Code = T2.Code
WHERE
        T2.Category = 'C100'
GROUP BY
        T1.FileID
HAVING
        T1.FileID LIKE 'F01%'

我使用以下方法获取所有日期而不是每个FileID的每个日期的最大值:

var query =

    from f in db.T1
    join c in db.T2 on f.Code equals c.Code
    group f by new { f.FileID, f.Date, c.Category } into g
    where g.Key.FileID.StartsWith("F01") && g.Key.Category.Equals("C100")
    select new
    {
        g.Key.FileID,
        MaxDate = g.Max(d=>d.Date)
    }

这似乎比需要的更复杂。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

为什么SQL只包含GROUP BY子句中的一列,而LINQ查询却包含三列?

您还应该在LINQ查询中where之前移动group by语句。

var query =
    from f in db.T1
    join c in db.T2 on f.Code = c.Code
    where c.Category = "C100"
    group f by f.FileID into g
    where SqlMethods.Like(g.Key, "F01%")
    select new
    {
        FileID = g.Key,
        MaxDate = g.Max(d => d.Date)
    }

答案 1 :(得分:2)

用这个修改你的linq:

在编写linq查询时,您需要记住定义格式的顺序

var query = ( from f in db.T1
              join c in db.T2 on f.Code = c.Code
              where c.Category = "C100"
              group f by  f.FileID into g
              select new
              {
                   FileID = g.Key,
                   MaxDate = g.Max(d=>d.Date)
              });