LINQ匿名类型没有给出我需要的列表

时间:2013-04-18 22:44:54

标签: c# asp.net-mvc linq anonymous-types

我正在对对象调用Recipe进行LINQ查询,需要按照它的分数进行排序。最初,我的IEnumberable类型为Recipe(已使用搜索条件过滤),名为selectedRecipies

然后,在我的朋友谷歌的帮助下,我使用匿名类型完成了此查询:

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));

我认为它有效...我的问题是,对于我的观点,我需要它是Recipe类型而finalQuery似乎属于IEnumerable<'a>类型a其中{{ 1}}是匿名类型......

如何在不打扰OrderByDescending的情况下获得List<> Recipe类型?

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分:2)

您应该创建一个新类RecipeViewModel(或RecipeDto)来捕获结果:

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

但你说

  

我需要它是Recipe类型

这使我怀疑您需要呈现Recipe的更多(或所有)数据。所以你可能应该深刻地重构查询。如果是这样,您仍然无法使用Recipe类本身,因为它没有Score属性:

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。如果没有,您应该使用join语句来包含评级。 (或介绍导航属性)。