2010-06-30 111 views
0

我遇到使用LINQ一些性能问题,导致我对我的第一个计算器问题:的LINQ查询链执行顺序

的测试功能在下面的代码,执行的次数differente数这两个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()); 

而且伯爵()函数,确确实实需要评估选择部分?这也意味着执行query2.Select(i => i)将激发测试()调用

如果这是要走的路,要执行类似调用的延迟过滤器,应将第二个查询更改为减少unnecesary测试()调用:

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

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

在此先感谢。

回答

0

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