Динамические выражения LINQ и Dynamic Lambda?
Каков наилучший способ динамического написания запросов LINQ и лямбда-выражений?
Я имею в виду приложения, где конечный пользователь может создавать правила бизнес-логики, которые затем должны выполняться.
Прошу прощения, если это вопрос новичков, но было бы здорово получить лучшие практики из опыта.
Ответы
Ответ 1
Я не могу рекомендовать больше, чем вы читаете через сообщения Барта Де Смета (http://community.bartdesmet.net/blogs/bart/), он действительно блестящий, когда дело доходит до Lambda.
В его недавней серии были рассмотрены динамические Lambda, начиная с http://community.bartdesmet.net/blogs/bart/archive/2008/08/26/to-bind-or-not-to-bind-dynamic-expression-trees-part-0.aspx
Абсолютно красивый код.
Ответ 2
Другая возможность заключается в интеграции сценария выполнения сценариев в вашу программу, чтобы ваши пользователи могли писать бизнес-логику в DSL. IronPython будет кандидатом.
Ответ 3
Я вижу два способа динамически генерировать лямбда. Вы можете попробовать Reflection.Emit сгенерировать IL (байтовый код .Net) напрямую и называть их как лямбда или вы можете использовать System.CodeDom и Microsoft.CSharp.CSharpCodeProvider для генерации кода из конструкций более высокого уровня. То, что вы хотите сделать, зависит от того, как вы хотите, чтобы пользователь вводил этот материал. Если вы хотите, чтобы пользователь написал С#, вы можете просто использовать встроенный компилятор.
Динамическое создание Linq должно быть проще. Вы должны иметь возможность генерировать запросы LINQ в виде деревьев выражений во время выполнения, а затем передавать их в исполняемый IQueryable. Я бы посоветовал вам изучить документацию по IQueryable, чтобы узнать больше об этом. Другой способ состоял бы в том, чтобы предварительно определить пару запросов linq, а затем позволить пользователю объединять их вместе. Это должно быть работоспособным, потому что любой запрос Linq возвращает IEnumerable, который может быть потреблен следующим запросом Linq.
Ответ 4
Лямбда-выражения могут быть легко созданы через пространство имен System.Linq.Expressions.
Ответ 5
System.Linq.Expressions - это то, что вам нужно. Я написал хороший пользовательский интерфейс, который позволяет пользователям определять и строить запросы динамически в форме дерева выражений. Затем вы можете передать это Linq2SQL или клиенту по вашему выбору.
Ответ 6
Я не понимаю, что вы имеете в виду, говоря "лучший способ". Было бы лучше предоставить простой пример того, чего вы хотите достичь. Составление динамического выражения LINQ не сложно, но сложно.
Вот пример создания динамического выражения linq:
Как составить существующие выражения Linq