LINQ: динамические операторы .Where () - PullRequest
1 голос
/ 02 августа 2010

Сценарий : у меня есть список и три фильтра поиска. Что-то вроде:

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 каждый раз, когда меняется только один из фильтров.

Любые слова мудрости приветствуются:)

Спасибо,
Michael

1 Ответ

1 голос
/ 02 августа 2010

(Предположение: вы использовали имя переменной OriginalList вместо OriginalQuery или что-то в этом роде, поэтому я предполагаю, что мы говорим о прямом LINQ-To-Object и IEnumerable здесь.)

Да, вы можете , сделав Result1 списком, а не 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 и повторно применить к Результату1 сто раз, а filter1 и filter2 будут применяться только по-прежнему.один раз.

Создание списка стоит, но это будет более чем компенсировано при повторном применении нескольких фильтров filter3, особенно если filter1 и filter2 сложны или существенно уменьшают набор.

...