Динамические выражения LINQ и Dynamic Lambda? - PullRequest
14 голосов
/ 22 сентября 2008

Каков наилучший способ динамического написания LINQ-запросов и лямбда-выражений?

Я имею в виду приложения, в которых конечный пользователь может разработать правила бизнес-логики, которые затем должны быть выполнены.

Прошу прощения, если это вопрос новичка, но было бы здорово получить лучшие практики из опыта.

Ответы [ 6 ]

11 голосов
/ 22 сентября 2008

Я не могу рекомендовать выше, чем вы, читая сообщения Барта де Смета (http://community.bartdesmet.net/blogs/bart/), он действительно великолепен, когда дело доходит до лямбды.

Его последние серии посвящены динамической лямбде, начиная с http://community.bartdesmet.net/blogs/bart/archive/2008/08/26/to-bind-or-not-to-bind-dynamic-expression-trees-part-0.aspx

Абсолютно красивый код.

2 голосов
/ 22 сентября 2008

Другой возможностью является интеграция среды выполнения сценариев в вашу программу, чтобы ваши пользователи могли писать бизнес-логику в DSL. IronPython будет кандидатом.

1 голос
/ 22 сентября 2008

Я вижу два способа, которыми вы можете динамически генерировать лямбда-выражения. Вы можете попробовать Reflection.Emit для генерации IL (байт-кода .Net) напрямую и вызвать их как лямбду, или вы можете использовать System.CodeDom и Microsoft.CSharp.CSharpCodeProvider для генерации кода из конструкций более высокого уровня. Что вы хотите сделать, зависит от того, как вы хотите, чтобы пользователь вводил этот материал. Если вы хотите, чтобы пользователь написал C #, вы можете просто использовать встроенный компилятор.

Генерация Linq динамически должна быть проще. Вы должны иметь возможность генерировать запросы LINQ как деревья выражений во время выполнения, а затем передавать их в IQueryable для выполнения. Я бы посоветовал вам изучить документацию по IQueryable, чтобы узнать больше об этом. Другим способом было бы заранее определить пару запросов linq, а затем позволить пользователю связать их вместе. Это должно быть работоспособным, потому что любой запрос Linq возвращает IEnumerable, который может быть использован следующим запросом Linq.

0 голосов
/ 23 сентября 2009

System.Linq.Expressions - это то, что вам нужно. Я написал хороший пользовательский интерфейс, который позволяет пользователям динамически определять и создавать запросы в форме дерева выражений. Затем вы можете передать это Linq2SQL или клиенту по вашему выбору.

0 голосов
/ 22 сентября 2008

Лямбда-выражения могут быть легко созданы через пространство имен System.Linq.Expressions.

0 голосов
/ 22 сентября 2008

Я не понимаю, что вы имеете в виду, говоря "лучший путь". Было бы лучше привести простой пример того, чего вы хотите достичь. Составление динамического выражения LINQ не сложно, но сложно.

Вот пример создания динамического выражения linq:

Как составить существующие выражения Linq

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...