3

私は検針を処理するためのシステムに取り組んでいます。

システムが顧客に属するすべてのメーターと、各メーターの最後の 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

必要なのは.Take(3)を正しい場所に置くことだと思います。あなたの場合、おそらくresult.Take(3)を実行しましたが、これは最初の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

これを試して:

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

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 に答える