LINQ:动态.Where()语句

时间:2010-08-02 16:42:09

标签: .net linq dynamic-linq

场景:我有一个列表和三个搜索过滤器。 类似的东西:

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语句。

非常感谢任何智慧的话语:)

谢谢,
迈克尔

1 个答案:

答案 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,而是一个实际可靠的内容列表,可以永久地应用filter1filter2。当第4行在上面执行时,它仍将不在您在第1行创建的实体列表中。您可以换出过滤器3并重新应用到Result1一百次,filter1filter2仍将只被申请过一次。

创建列表需要付费,但在重新应用多个filter3过滤器时,这将花费很多,特别是当filter1filter2复杂或大幅减少时集。