我编码通过MS 101的LINQ例子,并且连接被投掷我回路;)LINQ的GroupInto选择
例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 });
到第一个()的调用混淆我因为它不是在前面的查询表达式。
当我运行这个时,我得到一个错误,因为在它到达之前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
});