【问题标题】:Entity Framework Group By with Max Date and count具有最大日期和计数的实体框架分组依据
【发布时间】:2015-04-01 19:43:43
【问题描述】:

我有以下 SQL

SELECT  Tag , COUNT(*) , MAX(CreatedDate)
FROM    dbo.tblTags
GROUP BY Tag

输出如下:

+-----------------+------------------+-------------------------+
|       Tag       | (No column name) |    (No column name)     |
+-----------------+------------------+-------------------------+
| a great tag     |                1 | 2015-04-01 18:30:31.623 |
| not a test      |                1 | 2015-04-01 17:46:09.360 |
| test            |                5 | 2015-04-01 18:13:17.920 |
| test2           |                1 | 2013-03-07 16:53:54.217 |
+-----------------+------------------+-------------------------+

我正在尝试使用 EntityFramework 复制该查询的输出。

我有以下有效的逻辑:

    var GroupedTags = Tags.GroupBy(c => c.Tag)
        .Select(g => new 
        { 
            name = g.Key, 
            count = g.Count(), 
            date = g.OrderByDescending(gt => gt.CreatedDate).FirstOrDefault().CreatedDate 
        })
        .OrderBy(c => c.name);

但与原始 SQL 查询相比,执行时间非常长。关于如何优化我的方法的任何建议?感觉有点不对劲。

【问题讨论】:

  • 你可以使用 LinqPad 之类的东西来查看生成的 SQL 是什么,然后调整你的 linq 以得到更接近你想要的东西
  • 你也可以使用g.Max(x => x.CreatedDate)
  • 另外,请尝试添加ToList() 以确保它一次访问数据库。
  • @DLeh,是的,Max() 应该可以解决问题;)我建议您将其发布为答案。
  • 我已经添加了一个答案。希望有帮助

标签: c# sql linq entity-framework


【解决方案1】:

如果你想要一个最大值,请使用Max() Linq 方法:

var GroupedTags = Tags.GroupBy(c => c.Tag)
    .Select(g => new 
    { 
        name = g.Key, 
        count = g.Count(), 
        date = g.Max(x => x.CreatedDate)
    })
    .OrderBy(c => c.name);

【讨论】:

  • 当然。 Max 和 Linq 一样。完全隔开。完美运行。谢谢!
  • 如果我使用这个,Min 和 Max 都会给我最大日期
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多