【问题标题】:Converting SQL containing top, count, group and order to LINQ (2 Entities)将包含 top、count、group 和 order 的 SQL 转换为 LINQ(2 个实体)
【发布时间】:2025-12-06 00:45:02
【问题描述】:

一些 LINQ 查询仍然让我感到困惑。

对于包含两列“页面”和“日期”的“点击”表,我想在定义的时间段内找到最多行数的页面。

在 SQL 中我会使用这个:

SELECT TOP 10
      [Page]
      ,COUNT([Page]) as Number
FROM dbo.[Hits]
WHERE [Date] >= CONVERT(datetime,'14 Jan 2009')
AND [Date] < CONVERT(datetime,'15 Jan 2009')
Group BY [Page]
Order by Number DESC

在 LINQ 中我不知道如何处理这个问题,有人可以在这里帮助我吗?我尝试使用 linqer 对其进行转换,但它只是显示此表达式的错误。

【问题讨论】:

    标签: sql linq


    【解决方案1】:

    这样的事情应该可以工作:

    (from p in DataContext.Hits
    where (p.Date >= minDate) && (p.Date < maxDate)
    group p by p.Page into g
    select new { Page = g.Key, Number = g.Count() }).OrderByDescending(x => x.Number).Take(10);
    

    【讨论】:

    • p p.Date
    • 哦,当然,如果您的 linq 代码在 c# 中使用,则必须使用 '&&' 而不是 'and'。不知道在 VB 中需要如何。
    【解决方案2】:
    var top10hits = objectContext.Hits
      .Where(h => minDate <= h.Date && h.Date < maxDate)
      .GroupBy(h => h.Page)
      .Select(g => new { Page = g.Key, Number = g.Count() })
      .OrderByDescending(x => x.Number)
      .Take(10);
    

    【讨论】:

    • .Select(g => Page = g.Key, Number = g.Count()}) --> .Select(g => new {Page = g.Key, Number = g.Count()}) 否则“相同..但不同”:)
    • 感谢错字通知 - veggerby;和编辑 - 正义。
    • Also - @"same same... but different" 我发现扩展方法比查询理解语法更容易被发现。所以这就是我使用的。
    最近更新 更多