实体框架 - 具有order by和group by的Linq查询

zuf*_*und 12 c# mysql linq entity-framework

我有Measurement对象具有相关属性CreationTime(DateTime)和Reference(字符串)以及一些其他值.

我想一个高效的LINQ查询写入DbContext

  • Measurement按给定的方式分组我的对象Reference
  • 通过组CreationTime中第一个属性MeasurementCreationTime属性的平均值对组进行排序
  • 将查询限制为最新 numOfEntries

(在后面的步骤中,我计算这些返回组的平均值,但我想这与我的问题无关.)

DbContext本身有一个DbSet<Measurement>调用Measurements保存所有Measurement对象.

我提出了以下查询,这会产生一个正确排序但缺少某些组的组列表.

var groupByReference = (from m in context.Measurements
                          orderby m.CreationTime
                          group m by new { m.Reference } into g
                          select g).Take(numOfEntries).ToList();
Run Code Online (Sandbox Code Playgroud)

如何Measurement正确选择"最近的"组?

我正在使用Entity Framework 4.4和MySQL数据库(MySql Connector/Net 6.6.4).这个例子是简化的,我可以进一步详细说明和/或在必要时给出一个例子.

谢谢!

Nin*_*Nye 13

这是方法语法(我觉得更容易阅读),但这可能会这样做

更新了帖子评论

.FirstOrDefault()而不是.First()

关于日期平均值,您可能不得不暂时删除该顺序,因为此刻我无法访问IDE

var groupByReference = context.Measurements
                              .GroupBy(m => m.Reference)
                              .Select(g => new {Creation = g.FirstOrDefault().CreationTime, 
//                                              Avg = g.Average(m => m.CreationTime.Ticks),
                                                Items = g })
                              .OrderBy(x => x.Creation)
//                            .ThenBy(x => x.Avg)
                              .Take(numOfEntries)
                              .ToList();
Run Code Online (Sandbox Code Playgroud)


Mar*_*zek 1

尝试移动order by之后group by

var groupByReference = (from m in context.Measurements
                        group m by new { m.Reference } into g
                        order by g.Avg(i => i.CreationTime)
                        select g).Take(numOfEntries).ToList();
Run Code Online (Sandbox Code Playgroud)