Как динамически создавать LINQ

У меня есть сценарий, в котором у меня есть настраиваемые имена столбцов, связанные операторы, такие как ‹> = между и т. Д., А затем связанное значение.

Я пытаюсь определить, можно ли создать запрос LINQ с динамическим (строковым) предложением where?

Я заметил про Predicate.OR Preditcate.AND, но я говорю не совсем об этом.

Какие-либо предложения?


person Jabezz    schedule 18.08.2009    source источник
comment
Возможный дубликат этого stackoverflow.com/questions/736952/ вопрос   -  person Tim Jarvis    schedule 18.08.2009
comment
Однако Dynamic linq работает только с IQueryable, а не с IEnumerable - см. Примечание об AsQueryable в моем ответе ...   -  person Marc Gravell    schedule 19.08.2009


Ответы (3)


Если вы говорите о предложении string Where (а не о построении выражения и т. Д. Самостоятельно) - тогда Dynamic LINQ Library (в примерах 3.5, IIRC) должно быть достаточно.

Обратите внимание, что приведенный ниже пример предназначен для использования базы данных; но вы можете использовать его с LINQ-to-Objects, вызывая .AsQueryable() для ваших данных в памяти.

альтернативный текст

person Marc Gravell    schedule 18.08.2009
comment
Хотя Алекс был первым с библиотекой Dynamic LINQ, недостающая часть была поднята Марком (извините за то, что пропустил это). Вам нужен метод расширения .AsQueryAble (), чтобы иметь возможность работать с вашими коллекциями. - person Jabezz; 19.08.2009

На самом деле, есть специальная библиотека от Microsoft (System.Linq.Dynamic), которая поставляется с примерами C # VS2008, которая поддерживает это. Получите его здесь (загрузка Microsoft)

Библиотека включена в каталог \ LinqSamples \ DynamicQuery примеров для загрузки выше.

Подробные примеры использования см. На этой странице: http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

person Alex    schedule 18.08.2009
comment
Хорошо, на первый взгляд System.Linq.Dynamic выглядит именно так, как я ищу. Однако Dynamic linq работает только с IQueryable, а не с IEnumerable. Так что это все еще оставляет небольшую проблему. - person Jabezz; 18.08.2009
comment
@Jabezz: Это не проблема, это должно работать только на IQueryable из-за дизайна и намерения IQueryable. (Прочтите эту статью, чтобы лучше понять, как IQueryable возвращает данные по запросу.) Существует метод расширения IEnumerable.AsQueryable, который позволяет вам получить IQueryable на основе вашего IEnumerable. - person Bamdad; 05.07.2021

Также вы можете использовать деревья выражений для создания динамических запросов. Видеть:

http://msdn.microsoft.com/en-us/library/bb397951.aspx

http://www.interact-sw.co.uk/iangblog/2005/09/30/expressiontrees

http://blogs.msdn.com/charlie/archive/2008/01/31/expression-tree-basics.aspx

person Kamarey    schedule 18.08.2009
comment
Это более безопасный способ, чем использование DynamicLinq, который кажется очень уязвимым для инъекций. - person AgentFire; 05.03.2018