Linq To Objects - 在连接的引擎盖下

时间:2013-06-25 07:17:07

标签: c# linq

我想知道这两个linq语句之间的区别是什么?

什么更快?

他们是一样的吗?

此声明之间有什么区别

from c in categories
from p in products
where c.cid == p.pid
select new { c.cname, p.pname };

和这句话?

from c in categories
join p in products on c.cid equals p.pid
select new { c.cname, p.pname };

先谢谢你们。

编辑:在LINQ to Objects的背景下

1 个答案:

答案 0 :(得分:15)

好的,在LINQ to Objects中,差异可能非常大。

第一个表单检查每个 cp对,检查c.cid是否等于p.pid并产生匹配。

第二种形式(在Join内)首先创建从pid到匹配Product元素的基于散列的查找。然后它流式传输categories,然后根据Product检查查找中匹配c.cid个元素的每个类别。这通常更有效,因为它只需要查看products一次并创建基于散列的查找。另一方面,它具有更高的内存占用。当然,这一切都有些懒散 - 只有当你要求第一个结果发生任何重大事件时才会这样做。

有关Join操作的详细信息,请参阅我的Edulinq blog post on the topic