5

我正在编写 MS 101 Linq 教程。

我尝试将查询重构为 lambda/方法语法(反之亦然)。对我来说是一个挑战。

给定的查询是:

var custSupQuery =
    from sup in suppliers
    join cust in customers on sup.Country equals cust.Country into cs
    select new { Key = sup.Country, Items = cs };

我这样重写:

var custSupQuery = suppliers.Join(customers, s => s.Country, c => c.Country, (c, s) => new { Key = s.Country, Items = s, Items2 = c });

(我没有看到在 new 子句中组合这两种类型的字段的简单方法,所以我将它们分开)。

这似乎与编译器一起飞行,直到它到达显示循环。第二个 foreach 似乎无法处理该类型。

这是显示代码(适用于查询表达式,但不适用于 lambda/方法语法):

foreach (var item in custSupQuery)
{
    Console.WriteLine(item.Key + ":");
    foreach (var element in item.Items)  // <-- error here
    {
        Console.WriteLine("   " + element.CompanyName);
    }
}

错误是:

foreach 语句不能对“JoinOperators.Program.Customer”类型的变量进行操作,因为“JoinOperators.Program.Customer”不包含“GetEnumerator”的公共定义

我尝试通过AsEnumerable()调用结束我的 lambda/query 语法,但它仍然得到相同的错误。我不确定我可以使用什么作为类型,AsEnumerator<type_goes_here>因为它是匿名的,而且我似乎没有可以调用的对象GetType()

有什么建议么?

4

1 回答 1

5

join ... into语法不等同于但等同JoinGroupJoin. 这就是你必须使用的:

var custSupQuery =
    suppliers.GroupJoin(customers, s => s.Country, c => c.Country,
                        (s, cs) => new { Key = s.Country, Items = cs });
于 2013-02-20T14:49:41.887 回答