Динамический 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. Вот ссылка . Проект находится внутри проекта образцов С#.