为什么LINQ中的'equals'运算符加入?

时间:2009-10-25 10:48:47

标签: .net linq

为什么不链接只是在连接中使用==运算符,如果t可以在'where'子句中使用它?

2 个答案:

答案 0 :(得分:10)

连接中相等的两边被视为两个单独的lambda表达式,它们生成两个序列的键。

from category in categories
join prod in products on category.ID equals prod.CategoryID

categories.Join(products,
                category => category.ID,
                prod => prod.CategoryID,
                (category, prod) => new { Category = category, Product=prod });

使用equals关键字可以使一个lambda结束而另一个lambda开始变得无法辨认。另一方面,对于where子句,有一个lambda表达式决定每个项是否匹配:

from prod in products
where prod.CategoryID == 1

products.Where( prod => prod.CategoryID == 1 )

理论上,连接可以使用单个lambda实现

from category in categories
join prod in products on category.ID == prod.CategoryID

categories.Join(products,
                (category, prod) => category.ID == prod.CategoryID,
                (category, prod) => new { Category = category, Product=prod });

但是,通过计算两个键并进行比较本身,LINQ可以使用哈希表来计算连接,而不是必须为每对元素执行任意比较。

答案 1 :(得分:6)

您将不得不问设计师,但很明显,允许任何(布尔)表达式将允许太多的可能性。使用像equals这样的特殊关键字可以更容易地将它作为2个正确的列限制在规范中。

我找到了关于The Moth的讨论。