有没有一种方法将两个LINQ查询合并为一个?

4
我有一个名为dbRecipes的数组,其中包含按组分组的食谱列表。例如,“晚餐”组可能包括一只酿三文鱼、沙拉和土豆泥。而甜点组则可能包括巧克力熔岩蛋糕。嗯嗯。
我需要以分组列表的形式显示这些食谱,例如:
Group 1:
  - Recipe 1
  - Recipe 2
Group 2:
  - Recipe 3

每个 dbRecipes 中的项目都包含一个 Group 属性,其中包含有关它所在组的信息,以及一个包含配方信息的 Recipe 属性。
我想使用 LINQ 查询来遍历整个集合,但我并不是 LINQ 专家,所以我发现最好的方法是查询所有不同的组,然后循环遍历每一个组。下面是我的代码:
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);
   }
}

这似乎相当有效,但有没有更高效、更清晰或不需要多次查询的方法?谢谢!

可能这里的答案需要对提供程序有所了解;您能明确指出这是哪种LINQ吗?LINQ-to-SQL?实体框架?DbLinq?ADO.NET数据服务?还是其他什么? - Marc Gravell
普通的LINQ与断开的对象。没有什么特别的,我没有使用任何数据库提供程序。 - Mike Christensen
啊,k;被“db”前缀抛出;LINQ-to-Objects应该相当灵活。 - Marc Gravell
是的,这些对象来自数据库,但是它们是通过Castle ActiveRecord加载的,个人而言,我比LINQ to SQL或EF更喜欢它。 - Mike Christensen
2个回答

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

foreach(var r in g) 应该改为 foreach(var r in g.OrderBy(x => x.DisplayOrder)) - Jay
@Jay 感谢您指出这个疏忽。我已经在第一个查询中进行了更正,而不是在 foreach 循环中进行更正,因为这似乎更符合 OP 避免多个查询的要求。 - phoog
非常好的回答!虽然我认为应该是r.Recipe.Title而不是r.Title - 我已经修改了你的回答。 - Mike Christensen
@MikeChristensen 我认为你关于更正的想法是正确的,谢谢。 - phoog
这两个答案都非常好。我选择接受这个答案,因为它看起来更好一些或者其他什么原因 :) - Mike Christensen

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

我认为你的意思是使用 recipe.Recipe.Title 而不是 r.Title - Mike Christensen
我认为你也是想要这样写:OrderBy(g => g.Key.GroupOrder); - 其他部分似乎都可以工作,谢谢! - Mike Christensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接