linq连接运算符类型与lambda语法

时间:2013-02-20 14:42:12

标签: c# linq

我正在通过MS 101 Linq教程编写代码。

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

给定的查询是:

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

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

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

这是显示代码(使用查询表达式但不使用lambda / method语法):

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 /查询语法,但它仍然会得到相同的错误。我不确定我可以使用AsEnumerator<type_goes_here>中的类型,因为它是匿名的,我似乎没有可以调用GetType()的对象。

有什么建议吗?

1 个答案:

答案 0 :(得分:5)

join ... into语法不等同于Join,而是等同于GroupJoin。这就是你必须使用的东西:

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