场景 :我有一个列表和三个搜索过滤器。就像是:
ResultList = OriginalList.Where(filter1).Where(filter2).Where(filter3);
问题 :是否可以在不让LINQ运行filter1和filter2的情况下,更新过滤器3,然后更新ResultList? (我想提高性能)
基本上,它与以下内容相同:
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语句。
任何智慧的话都非常感激:)
谢谢,
麦可
(假设:您使用的是变量名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
很复杂或大大减少了设置的情况下。