2010-08-02 6 views
1

Сценарий: У меня есть список и три поисковых фильтра. Что-то вроде:LINQ: Dynamic. Where() Заявления

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

Ваш источник данных? Linq to SQL? XML? Объекты? – GalacticCowboy

ответ

1

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

Да, вы можете, сделав Result1 a 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 являются сложными или существенно уменьшить набор.

+0

И если вы сберете Result1 где-нибудь, чтобы его можно было повторно использовать, то filter3 будет * all *, который вам нужно применить. – GalacticCowboy

+0

Спасибо! Я должен был объяснить немного дальше: я хотел бы также иметь возможность изменять filter1 и filter2 :) Я более внимательно посмотрел на CLINQ, и я считаю, что можно использовать его так же, как вы только что описали , Поверхность CLINQ заключается в том, что она может затем повторно оценивать только один фильтр за раз (скажем, фильтр обновлений1), а затем только элементы, которые добавляются/удаляются через фильтр 1, затем переоцениваются фильтром2, а затем filter3. Это должно значительно уменьшить нагрузку на память и процессор. Мне нужно сначала подтвердить это разработчиком CLINQ. Я обновлю вас как можно скорее – Bodekaer

+0

CLINQ звучит так, как вы хотите. Скорее всего, ваш код будет проще. Я не думаю, что это увеличит производительность. Для этого вам нужно будет составить план и быть умным. Это может быть сложно. Возможно, вам понадобятся кэшированные промежуточные списки или попытайтесь предсказать, что пользователь может переключать дальше, что-то вроде этого. Удачи. –