2017-02-09 4 views
1

Entity FrameworkとLINQにはほとんど慣れていません。私は私たちのいくつかの特別な行をフィルタリングしたいいくつかの列を持つ単一のエンティティセットを持っています。 4行の名前はGuid(文字列)、Year(ショート)、Month(ショート)、FileIndex(ショート)です。私は、Guid-Year-Monthの既存の組み合わせごとに最大のFileIndexを持つすべての行を取得したいと考えています。LINQクエリを単純化して特別な行をフィルタリングする方法

私の現在のソリューションは、次のようになります。

var maxFileIndexRecords = from item in context.Udps 
      group item by new { item.Guid, item.Year, item.Month } 
      into gcs 
      select new { gcs.Key.Guid, gcs.Key.Year, gcs.Key.Month, 
      gcs.OrderByDescending(x => x.FileIndex).FirstOrDefault().FileIndex }; 

var result = from item in context.Udps 
     join j in maxFileIndexRecords on 
     new 
     { 
      item.Guid, 
      item.Year, 
      item.Month, 
      item.FileIndex 
      } 
      equals 
      new 
      { 
       j.Guid, 
       j.Year, 
       j.Month, 
       j.FileIndex 
      } 
      select item; 

私は、より高いパフォーマンスと短いソリューションがあるはずだと思います。誰かが私にヒントを持っていますか? ありがとうございました

+0

理論的には、ネストされたクエリの最大値を持つ値を選択すると、理論的にはネストされたクエリを実行できるはずです。そしてネストされたクエリはあなたのグループです。 – smoksnes

答えて

0

あなたは近くでした。実際にははグループ化キーを選択する必要はありません。それぞれのグループの最初の項目を選択するだけです:

var maxFileIndexRecords = 
     from item in context.Udps 
     group item by new { item.Guid, item.Year, item.Month } 
     into gcs 
     select gcs.OrderByDescending(x => x.FileIndex).FirstOrDefault(); 
関連する問題