2013-04-18 7 views
5

私は、オブジェクトのコールRecipeのLINQクエリを実行していますが、そのスコアで注文する必要があります。LINQの匿名タイプが必要なリストを提供していません

var finalQuery = ((from h in db.StarRatings 
         where selectedRecipies.Any(sr => sr.IDRecipe == h.IDRecipe) 
        group h by new { h.IDRecipe } into hh 
        select new 
        { 
         hh.Key.IDRecipe, 
         Score = hh.Sum(s => s.Score) 
        }).OrderByDescending(i => i.Score)); 
:最初は、私は(すでに検索条件でろ過)タイプ RecipeIEnumberableが、私は匿名型を使用して、このクエリを行っている私の友人のGoogleの助けを借りて、その後

selectedRecipiesと呼ばれてい

そして、私はそれが仕事だと思う...私の問題は私のビューのために、私はそれがタイプRecipefinalQueryであることが必要ということですaは匿名型であるタイプIEnumerable<'a>であるように思わ...

どのようにすることができますを取得OrderByDescendingを妨害することなくレシピタイプの?

答えて

2

あなたは結果をキャプチャする新しいクラスRecipeViewModel(またはRecipeDto)を作成する必要があります。

select new RecipeViewModel 
{ 
    hh.Key.IDRecipe, 
    Score = hh.Sum(s => s.Score) 
}).OrderByDescending(i => i.Score)); 

しかし、あなたたとえば

レシピ

これにより、より多くの(またはすべての)データがRecipeであることが必要と思われます。だからおそらく深くクエリを再構成する必要があります。

from r in db.Recipes 
where // ..... (do your filtering here) 
select new RecipeViewModel 
    { 
     Id = r.Id, 
     // ... more recipe properties 
     Score = r.StarRatings.Sum(rating => rating.Score) 
    } 

ナビゲーションプロパティRecipe.StarRatingsがあることを仮定:それはScore性質を持っていないので、もしそうなら、あなたはまだ、Recipeクラス自体を使用することはできません。そうでない場合は、評価を含めるにはjoinステートメントを使用する必要があります。 (またはナビゲーションプロパティを導入する)。

+0

あなたは私がそれを考えるのを助けます。実際、私はRecipeViewModelのリストを作成するためにRecipeのリストが必要でした...だからちょうどRecipeViewModelの私のリストを作成し、直後にその注文をしました...私はとても馬鹿だと感じます!ありがとう! –

2

代わりに匿名型を作成するのではなく、あなたがRecipeを作成する必要があります。

select new Recipe // Use constructor or object initiailizer here 
       { 
        ID = hh.Key.IDRecipe, 
        Score = hh.Sum(s => s.Score) 
       }).OrderByDescending(i => i.Score)) 
       .ToList(); // To make your List<T> 
+0

しかし、レシピにはすでに投票のリストに情報があるので、スコアメンバーはありません –

+0

もっと明確にするために、すべてのレシピにはユーザーが行った「0〜n」個の「レーティング」があることを意味します。たぶん、解決策は、これらのすべてを平均して1つのステップで実行することですが、これはlinqでの私のスキルを超えています。 –