2017-11-07 9 views
0

私はEntity Frameworkが初めてのので、このアプローチでは苦労しています。私は実際に、EFに関連する特別なものがあるのか​​、それとも私に制限があるのか​​分からない。グループ化されたアイテムを反復して比較するには?

私はデータベースからいくつかのレコードをグループ化したいと思っています。そのあと、グループを繰り返して、同じグループ内の他のすべての要素と比較する各グループの要素を繰り返し処理したいと思います。

私はシナリオを説明するための2つの単純なクラスを作成している:

public class MyContext : DbContext 
{ 
    public DbSet<MyClass> MyClass { get; set; } 
} 

をそして私が注入文脈で、これまで持って何

public class MyClass 
{ 
    public int Id { get; set; } 
    public int Value { get; set; } 
} 

は次のとおりです。

this.MyContext.MyClass 
      .GroupBy(x => x.Value) 
      .ToList() // need to materialize here 
      .ForEach(grp => 
      { 
       // compare each item with all the other 
       // items in the current group   
      }); 

しかし、アイテムを繰り返し処理し、同じグループ内の他のアイテムと比較する方法はわかりません。

+0

私は2つの入れ子になった 'Foreach'を試してみました私はこのような状況に直面したことはなく、3つのネストされた 'foreach'ステートメントが何かを実行可能にすることは想像もできませんでした。 – Nandolcs

答えて

0

次のコードでは、どのタイプがgrpになりますか?

this.MyContext.MyClass 
    .GroupBy(x => x.Value) 
    .ToList() // need to materialize here 
    .ForEach(grp => 
    { 
    // compare each item with all the other 
    // items in the current group   
    }); 

まあgrp変数の型IGrouping<TKey, TElement>です。そのタイプはので、各grpはそう、あなたがGRPのすべての項目に好きなforeachまたは行うことができますTElementリストあるIEnumerable<TElement>に由来します。

DotNetFiddle Example

+0

答えをありがとう、私は3つのネストされたforeachステートメントを行う必要がありますか?これはちょうど私の心を盗んだが、感謝します。 – Nandolcs

+0

DotNet Fiddle Exampleを追加しました。 –

+0

ありがとうございました。あなたが提供したフィールドの例を使ってすべてを手に入れました。私の場合は、同じグループのすべての人を互いに比較しなければならなかったので、もう1つのネストループを追加しました。ありがとうございました。 – Nandolcs

0

変数grpIGrouping<int, MyClass>です。 IEnumerable<MyClass>として扱うことができます。たとえば、次のような最大のIDを持つアイテムを取得することができます。

this.MyContext.MyClass 
    .GroupBy(x => x.Value) 
    .ToList() // need to materialize here 
    .ForEach(grp => 
    { 
     MyClass itemWithMaxId = grp.FirstOrDefault(); 
     foreach (MyClass item in grp) 
     { 
      if (item.Id > itemWithMaxId.Id) 
      { 
       itemWithMaxId = item; 
      } 
     }  
    }); 

注意、しかし、ForEachメソッドは何も返さないこと、それだけで、リストの各要素に指定されたアクションを実行します。あなたは、各グループの最大のIDを持つインスタンスのために何か、アイテムを取得したい場合は、私は、この例のように、あなたはLinqによって提供さSelect方法を使用することをお勧め:

var itemsWithMaxIdByGroup = this.MyContext.MyClass 
    .GroupBy(x => x.Value) 
    .ToList() // need to materialize here 
    .Select(grp => 
    { 
     MyClass itemWithMaxId = grp.First(); 
     foreach (MyClass item in grp.Skip(1)) 
     { 
      if (item.Id > itemWithMaxId.Id) 
      { 
       itemWithMaxId = item; 
      } 
     } 

     return itemWithMaxId;  
    }); 
+0

GroupByによって生成されたグループは、常に少なくとも1つの要素を持ちます。言い換えれば、彼らは決して空ではないでしょう – pinkfloydx33

+0

@ pinkfloydx33そうです、私は私の例では、ありがとう、ありがとう。 –

関連する問題