Linq链查询执行顺序

时间:2010-06-30 11:45:29

标签: linq chaining

我正在使用linq遇到一些性能问题,这导致了我的第一个stackoverflow问题:

以下代码中的测试函数对这两个linqs查询执行的次数不同:

int[] mydata = { 1, 2, 34, 5, 67, 8 };

var query = from i in mydata select new { i,v=test(i)};       
var query2 = query.Where(v=>v.v == 2);
MessageBox.Show(query2.Count().ToString());

var query = from i in mydata where i==2 select new { i,v=test(i)};       
MessageBox.Show(query.Count().ToString());

还有Count()函数,确实需要评估选择部分吗?这也意味着执行一个query2.Select(i => i)将触发test()调用一个

如果要这样做,要执行像调用这样的延迟过滤器,应该更改第二个查询以减少不必要的test()调用:

var query = from i in mydata where (filter ? v=filtevalue : true) select new { v=test(i)};       
MessageBox.Show(query.Count().ToString());

我需要执行的是构建一个大查询,然后在程序的不同部分过滤数据,而不执行过滤掉数据的选择部分(以避免性能损失)。这可能吗?

提前致谢。

1 个答案:

答案 0 :(得分:0)

Count涉及枚举。枚举涉及执行Select,执行test。如果您只想计算,则根本不需要Select,因为它不会改变元素的数量。如果您想减少查询中的test次来电,请尝试将Where放在Select之前。 (.Where(..).Select(..))如果您的搜索谓词(lamda在哪里)取决于函数test的结果,那么就无法避免这些调用。