2008-09-22 3 views
14

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

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

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

ответ

11

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

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

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

1

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

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

2

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

+0

Звуковой совет. Мы сделали это для настройки рабочих процессов, и он работает очень хорошо. –

+0

Единственным недостатком является то, что вы можете столкнуться с проблемами с полным/частичным доверием, которые предотвратили бы выполнение вашего кода в asp.net – viggity

+0

, это возможность, но это не ответ на мой вопрос ... – Sklivvz

-1

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

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

How do I compose existing Linq Expressions

+0

Аку, если это сложно то есть, безусловно, лучшие практики? – Sklivvz

+1

Я не знаю «лучших практик» для таких вещей. Я знаю, как решить конкретную проблему, но общий «лучший способ» - слишком неопределенный вопрос. – aku

0

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

0

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

Смежные вопросы