14

関連するプロパティ(DateTime) と(String) およびその他の値を持つMeasurementオブジェクトがあります。CreationTimeReference

DbContextそのための効率的なlinqクエリを書きたいと思います

  • 与えられたグループでMeasurementオブジェクトをグループ化Reference
  • CreationTimeグループの最初のプロパティまたはプロパティMeasurementの平均のいずれかでグループを並べ替えますCreationTime
  • クエリを最新のものに制限するnumOfEntries

(後のステップで、これらの返されたグループの平均値を計算しますが、それは私の問題には関係ないと思います。)

DbContext 自体には、すべてのオブジェクトを保持するDbSet<Measurement>呼び出しがあります。MeasurementsMeasurement

次のクエリを思いつきました。これにより、正しく順序付けされているが、間にいくつかのグループが欠落しているグループのリストが得られます。

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

の「最新」のグループをMeasurement正しく選択するにはどうすればよいですか?

MySQL データベース (MySql Connector/Net 6.6.4) で Entity Framework 4.4 を使用しています。この例は簡略化されています。必要に応じて、より詳細に説明したり、例を示したりできます。

ありがとう!

4

4 に答える 4

15

これはメソッド構文です(私は読みやすいと思います)が、これでうまくいくかもしれません

投稿コメントを更新

.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();
于 2013-03-22T14:01:32.880 に答える
1

order byafter を移動してみてください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();
于 2013-03-22T13:50:15.733 に答える
0

あなたの要件はいたるところにありますが、これは私の理解に対する解決策です:

参照プロパティでグループ化するには:

var refGroupQuery = (from m in context.Measurements
            group m by m.Reference into refGroup
            select refGroup);

ここで、「最新の numOfEntries」で結果を制限したいと言っています。これは、返される測定値を制限したいという意味だと思います...その場合:

var limitedQuery = from g in refGroupQuery
                   select new
                   {
                       Reference = g.Key,
                       RecentMeasurements = g.OrderByDescending( p => p.CreationTime ).Take( numOfEntries )
                   }

グループを最初の Measurement 作成時間で並べ替えるには (測定値を並べ替える必要があることに注意してください。最も早い CreationTime 値が必要な場合は、"g.SomeProperty" を "g.CreationTime" に置き換えます):

var refGroupsOrderedByFirstCreationTimeQuery = limitedQuery.OrderBy( lq => lq.RecentMeasurements.OrderBy( g => g.SomeProperty ).First().CreationTime );

グループを平均 CreationTime で並べ替えるには、DateTime 構造体の Ticks プロパティを使用します。

var refGroupsOrderedByAvgCreationTimeQuery = limitedQuery.OrderBy( lq => lq.RecentMeasurements.Average( g => g.CreationTime.Ticks ) );
于 2013-03-26T23:09:51.150 に答える