首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >显示group by中每个元素的3个结果

显示group by中每个元素的3个结果
EN

Stack Overflow用户
提问于 2012-05-26 04:14:45
回答 3查看 126关注 0票数 3

我正在开发一个用于处理仪表读数的系统。

我想生成一个输出,其中系统显示属于客户的所有仪表,以及每个仪表的最后三个读数。

到目前为止,我必须遵循以下代码:

代码语言:javascript
复制
 var lastMeterReading = from meeters in metermodel.Meeters
                              join reading in metermodel.Readings on meeters.MeterNumber equals reading.MeterNumber
                              where (maalers.CustNo == 6085574)
                              orderby reading.Date descending
                              group meeters by new { meeters.MeterNumber, reading.Consumption, reading.Date } into result
                              select new
                              {
                                  Consumption = result.Key.Consumption, No = result.Key.MeterNumber, Date = result.Key.Date
                              };

现在,它显示了属于客户的所有仪表。如果我放入一个.take(3),它只显示前3个结果。

谢谢!丹尼尔

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-05-26 05:25:24

我认为您需要的是将.Take(3)放在正确的位置。在本例中,您可能使用了result.Take(3),但这意味着获取前三个组(及其所有元素)。

下面是我试图展示我的意思,但是,我想你需要在最后一部分中修复它,因为我没有数据来测试它,因此我不确定我试图访问的东西在那个时候是否可以访问。但我希望你能明白我的意思。

代码语言:javascript
复制
var lastMeterReading = (from meeters in metermodel.Meeters
                       join reading in metermodel.Readings on meeters.MeterNumber equals reading.MeterNumber
                       where (maalers.CustNo == 6085574)
                       orderby reading.Date descending
                       group meeters by new { meeters.MeterNumber, reading.Consumption, reading.Date } into result
                       from m in result
                       select new {Key = m.Key, Info = result.OrderByDescending(r => r.Date).Take(3)})
                       .Select(r => new 
{ Consumption = r.Consumption, No = r.MeterNumber, Date = r.Date });
票数 0
EN

Stack Overflow用户

发布于 2012-05-26 04:23:54

试试这个:

代码语言:javascript
复制
var lastMeterReading = from meeters in metermodel.Meeters
                       join reading in metermodel.Readings on meeters.MeterNumber equals reading.MeterNumber
                       where (maalers.CustNo == 6085574)
                       orderby reading.Date descending
                       group meeters by new { meeters.MeterNumber, reading.Consumption, reading.Date } into result
                       from m in result.Take(3)
                       select new
                       {
                           Consumption = m.Consumption, No = m.MeterNumber, Date = m.Date
                       };
票数 0
EN

Stack Overflow用户

发布于 2012-05-26 10:00:52

您只想按MeterNumber分组。按照您现在进行分组的方式,您将为每个唯一的MeterNumber-Consumption Date组合获得一个新的组。

你也可以使用LINQ的GroupJoin操作符来简化你的查询。在查询语法中,使用"join..on..into“模式:

代码语言:javascript
复制
from meter in meterModel.Meters
  where (meter.CustNo == 6085574)
  join reading in meterModel.Readings
  on meter.MeterNumber equals reading.MeterNumber
  into meterGroup
  select meterGroup.OrderByDescending(r => r.Date).Take(3);

或者使用点符号:

代码语言:javascript
复制
meterModel.Meters
    .Where(x => x.CustNo == 6085574)
    .GroupJoin(
        meterModel.Readings, 
        meter => meter.MeterNumber, 
        reading => reading.MeterNumber, 
        (meter,readings) => readings.OrderByDescending(r => r.Date).Take(3))
    ;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10760833

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档