我正在使用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());
我需要执行的是构建一个大查询,然后在程序的不同部分过滤数据,而不执行过滤掉数据的选择部分(以避免性能损失)。这可能吗?
提前致谢。
答案 0 :(得分:0)
Count
涉及枚举。枚举涉及执行Select
,执行test
。如果您只想计算,则根本不需要Select
,因为它不会改变元素的数量。如果您想减少查询中的test
次来电,请尝试将Where
放在Select
之前。 (.Where(..).Select(..)
)如果您的搜索谓词(lamda在哪里)取决于函数test
的结果,那么就无法避免这些调用。