2012-01-12 12 views
4

dbRecipesと呼ばれる配列があり、グループに分割されたレシピのリストが含まれています。たとえば、ディナーグループには、サケ、サラダ、マッシュポテトが入っている可能性があります。デザートグループにはチョコレート溶けた溶岩ケーキがあります。んー。私のような、グループ化されたリスト内のこれらのレシピを表示する必要が2つのLINQクエリを1つに結合する方法はありますか?

dbRecipesに各項目

Group 1: 
    - Recipe 1 
    - Recipe 2 
Group 2: 
    - Recipe 3 

は、それが中だどのグループに関する情報が含まれていGroupプロパティが含まれている、との情報が含まれていますRecipeプロパティレシピ。

LINQクエリを使用して全体を反復処理したいのですが、私はLINQのエキスパートではありません。したがって、私が見つけた最良の方法は、すべての個別のグループをクエリし、それらの1つここに私のコードは次のとおりです。

var groups = (from g in dbRecipes orderby g.Group.GroupOrder select g.Group).Distinct(); 
foreach (var g in groups) 
{ 
    output.Write("{0}<br/>", g.GroupName); 

    var recipes = (from r in dbRecipes where r.Group == g orderby r.DisplayOrder select r.Recipe); 
    foreach(var r in recipes) 
    { 
     output.Write("---{0}<br/>", r.Title); 
    } 
} 

これはかなりうまく動作するようだが、クリーナーおそらくより効率的だ、または複数のクエリを必要としない、これを行う方法はありますか?ありがとう!

+0

それはここで答えは、プロバイダの知識を必要とすることであってもよく、これはどのLINQについて明示できますか? LINQ-to-SQL?エンティティフレームワーク? DbLinq? ADO.NET Data Services?何か? –

+0

毎日LINQで切断されたオブジェクトを使用しています。私は特別なことは何も、私はDBプロバイダを使用していない。 –

+0

ah、k; "db"プレフィックスによってスローされました。 LINQ-to-Objectsはかなり収容されているはずですが、 –

答えて

3
var groups = 
    from r in dbRecipes 
    orderby r.DisplayOrder 
    group r by r.Group into g 
    orderby g.Key.GroupOrder 
    select g; 

foreach (var g in groups) 
{ 
    output.Write("{0}<br/>", g.Key.GroupName); 

    foreach(var r in g) 
    { 
     output.Write("---{0}<br/>", r.Recipe.Title); 
    } 
} 
+0

'foreach(var r in g)'は 'foreach(var r in g.OrderBy(x => x.DisplayOrder))'であるべきです。 ' – Jay

+0

@Jay監督を指摘してくれてありがとう。 foreachループではなく、最初のクエリで修正しました。これはOPの複数のクエリを回避する必要があるためです。 – phoog

+0

優秀な答え!私はr.Titleではなくr.Recipe.Titleだと信じていますが、あなたの答えを修正しました。 –

2

テストされていないが、ここではGroupByを使用して適応したものです:

var groups = dbRecipes.GroupBy(r => r.Group).OrderBy(g => g.Key.GroupOrder); 
foreach(var recipeGroup in groups) 
{ 
    output.Write("{0}<br/>", recipeGroup.Key.GroupName); 
    foreach(var recipe in recipeGroup.OrderBy(r => r.DisplayOrder)) 
    { 
     output.Write("---{0}<br/>", recipe.Recipe.Title); 
    } 
} 
+0

私はあなたが 'r.Title'の代わりに' recipe.Recipe.Title'を意味すると思います。 –

+0

私はあなたも意味すると思います: 'OrderBy(g => g.Key.GroupOrder);' - 残りはうまくいくようです。 –

関連する問題