Динамический LINQ на IEnumerable?

Скажем, мне нужно отфильтровать общий список с динамическим запросом (List<string> l; var x = l.Where(*dynamic query*))

Как мне это сделать с помощью LINQ? (В настоящее время используется фильтр строк в dataview)

Я видел сообщение от scott g: но он не работает с объектами, использующими IEnumerable (включая общие списки)

Кто-нибудь может предложить какие-либо идеи?

Ответы

Ответ 1

Предполагая, что вы имеете в виду строковый запрос: динамическая библиотека LINQ будет работать нормально; просто сначала вызовите .AsQueryable():

string s = *dynamic query*
var qry = l.AsQueryable().Where(s);

Это дает вам обертку IQueryable<T> вокруг вашего списка, которая обеспечивает доступ к динамическим методам расширения LINQ.

Ответ 2

Вы можете использовать метод FindAll(), который использует предикат. Вот базовый пример.

List<string> stringList = new List<string>(new string[]{"Smith", "Johnson", "Jordan","Doe"});

List<string> filteredStringList = stringList.FindAll(x => x == "Smith");

Также метод Find возвращает один элемент.

В MSDN также есть пример проекта для выполнения динамических запросов LINQ как для IEnumerable, так и для IQueryable. Вы можете повторно использовать класс DynamicQueryable. Вот ссылка . Проект находится внутри проекта образцов С#.