【发布时间】:2013-02-25 15:40:29
【问题描述】:
您好,我正在编写 MS 101 linq 示例。
“JoinOperators”让我很难受,因为我正在尝试将查询表达式重构为 lambda 语法,反之亦然。
无论如何,以105为例,我看到了这个查询表达式:
var supplierCusts =
from sup in suppliers
join cust in customers on sup.Country equals cust.Country into cs
from c in cs.DefaultIfEmpty() // DefaultIfEmpty preserves left-hand elements that have no matches on the right side
orderby sup.SupplierName
select new
{
Country = sup.Country,
CompanyName = c == null ? "(No customers)" : c.CompanyName,
SupplierName = sup.SupplierName
};
我尝试以这种方式将其实现为 lambda:
// something is not right here because the result keeps a lot of "Join By" stuff in the output below
var supplierCusts =
suppliers.GroupJoin(customers, s => s.Country, c => c.Country, (s, c) => new { Customers = customers, Suppliers = suppliers })
.OrderBy(i => i.Suppliers) // can't reference the "name" field here?
.SelectMany(x => x.Customers.DefaultIfEmpty(), (x, p) => // does the DefaultIfEmpty go here?
new
{
Country = p.Country,
CompanyName = x == null ? "(No customers)" : p.CompanyName,
SupplierName = p // not right: JoinOperators.Program+Customer ... how do I get to supplier level?
});
由于某种原因,我无法通过这种方式访问供应商级别的信息。当我用suppliers 切换customers 时,我无法访问客户级别的信息。
是否有一些 SelectMany() 过载让我可以从两个对象的字段级别中提取?
另外,我不明白为什么 GroupJoin() 似乎返回了一个包含 2 个集合(suppliers 和 customers)的对象。不应该以某种方式加入他们吗?
我想我不明白GroupJoin() 的工作原理。
【问题讨论】: