3

我正在开发一个处理抄表的系统。

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

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

 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 个结果。

谢谢!丹尼尔

4

3 回答 3

0

试试这个:

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
                       };
于 2012-05-25T20:23:54.423 回答
0

我认为您需要将 .Take(3) 放在正确的位置。在您的情况下,您可能做了 result.Take(3) 但这意味着取前三组(及其所有元素)。

下面是试图说明我的意思,但是,我想你需要在最后一部分修复它,因为我没有数据来测试它,因此我不确定我是什么此时可以访问尝试访问。但我希望你明白我的意思。

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 });
于 2012-05-25T21:25:23.770 回答
0

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

您还可以使用 LINQ 的 GroupJoin 运算符简化查询。在查询语法中,您使用“join..on..into”模式:

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);

或使用点符号:

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))
    ;
于 2012-05-26T02:00:51.527 回答