我正在通过 MS 101 Linq 示例进行编码,连接让我陷入了循环;)
示例104旨在展示稍微复杂的组连接是如何工作的:
var prodByCategory =
from cat in categories
join prod in products on cat equals prod.Category into ps
from p in ps // <-- ?
select new { Category = cat, p.ProductName };
带“?”的部分 让我感到困惑,因为它看起来 p 与 ps 完全相同,并且该子句不在前面的示例中。
所以我尝试使用方法/linq 语法来编写它,我放在一起看起来像这样:
var prodByCategory = categories.GroupJoin(products, c => c, p => p.Category, (c, p) => new { Category = c, p.First().ProductName });
对 First() 的调用让我感到困惑,因为它不在前面的查询表达式中。
当我运行它时,我得到一个错误,因为 p 在它到达第一个之前是空的。我不确定这怎么可能,因为类别列表肯定与产品集合中的类别匹配。
foreach (var item in prodByCategory)
{
Console.WriteLine(item.ProductName + ": " + item.Category);
}
产品已经有一个类别字段。那么查询有什么好处呢?我想这只是一个学习的东西,但我无法理解这里的价值(尽管这可能是因为我不明白这两个集合是如何相关的)。
更新:
玩弄了格特的建议。请参阅下面他清晰的解释。经过轻微的清理后,这有效:
var prodByCategory = categories.GroupJoin(products, cat => cat, prod => prod.Category,
(cat, prod) => new { cat, products })
.SelectMany(x => x.products
, (x, p) =>
new
{
Category = x.cat, // x.cat.CategoryName not accessible here
ProductName = p.ProductName
});