1

场景:我有一个列表和三个搜索过滤器。就像是:

ResultList = OriginalList.Where(filter1).Where(filter2).Where(filter3);


问题:我是否可以更新过滤器 3,然后更新 ResultList,而不让 LINQ 运行过滤器 1 和过滤器 2?(我想提高性能)

基本上,它将与以下内容相同:

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

非常感谢任何智慧之言:)

谢谢,
迈克尔

4

1 回答 1

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创建列表是有成本的,但是当重新应用多个过滤器时,这将远远弥补,特别是如果filter1filter2是复杂的或大大减少了集合。

于 2010-08-02T16:47:11.153 回答