场景:我有一个列表和三个搜索过滤器。 类似的东西:
ResultList = OriginalList.Where(filter1).Where(filter2).Where(filter3);
问题:我是否可以更新过滤器3,然后更新ResultList,而不使用LINQ运行filter1和filter2? (我想提高表现)
基本上,它与:
相同Result1 = OriginalList.Where(filter1).Where(filter2);
Result2 = Result1.Where(filter3);
UpdateFilter3(); // Just changes the filter somehow
Result2 = Result1.Where(filter3);
return Result2;
跟踪这个只是有点麻烦,我想知道是否有更聪明的方法来做到这一点? 我查看了Continuous LINQ(CLINQ:http://clinq.codeplex.com/),但是,它似乎只是告诉LINQ每次只有一个过滤器更改时刷新整个WHERE语句。
非常感谢任何智慧的话语:)
谢谢,
迈克尔
答案 0 :(得分:1)
(假设:你使用了一个变量名OriginalList
而不是OriginalQuery
或类似的东西,所以我假设我们在这里讨论直接的LINQ-To-Object和IEnumerable。)
是的,你可以,将Result1设为List而不是IEnumerable。像这样:
Result1 = OriginalList.Where(filter1).Where(filter2).ToList();
Result2 = Result1.Where(filter3);
UpdateFilter3(); // Just changes the filter somehow
Result2 = Result1.Where(filter3);
return Result2;
作为一个列表,Result1
不仅仅是一个等待的IEnumerable,而是一个实际可靠的内容列表,可以永久地应用filter1
和filter2
。当第4行在上面执行时,它仍将不在您在第1行创建的实体列表中。您可以换出过滤器3并重新应用到Result1一百次,filter1
和filter2
仍将只被申请过一次。
创建列表需要付费,但在重新应用多个filter3
过滤器时,这将花费很多,特别是当filter1
和filter2
复杂或大幅减少时集。