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





Я вижу два способа динамического создания лямбда-выражений. Вы можете попробовать Reflection.Emit для генерации IL (байт-кода .Net) напрямую и вызвать их как лямбда, или вы можете использовать System.CodeDom и Microsoft.CSharp.CSharpCodeProvider для генерации кода из конструкций более высокого уровня. То, что вы хотите сделать, зависит от того, как вы хотите, чтобы пользователь вводил эти данные. Если вы хотите, чтобы пользователь писал C#, вы можете просто использовать встроенный компилятор.
Динамическое создание Linq должно быть проще. Вы должны иметь возможность генерировать запросы LINQ в виде деревьев выражений во время выполнения, а затем передавать их в IQueryable для выполнения. Я предлагаю вам изучить документацию по IQueryable, чтобы узнать об этом больше. Другой способ - предварительно определить пару запросов linq, а затем позволить пользователю объединить их в цепочку. Это должно быть работоспособным, потому что любой запрос Linq возвращает IEnumerable, который может быть использован следующим запросом Linq.
Другая возможность - интегрировать среду выполнения сценариев в вашу программу, чтобы ваши пользователи могли писать бизнес-логику в DSL. IronPython будет кандидатом.
Единственным недостатком является то, что вы можете столкнуться с проблемами с полным / частичным доверием, которые могут помешать выполнению вашего кода в asp.net.
Я не понимаю, что вы имеете в виду, говоря «лучший способ». Было бы лучше привести простой пример того, чего вы хотите достичь. Составить динамическое выражение LINQ несложно, но сложно.
Вот пример создания динамического выражения linq:
Как составить существующие выражения Linq
Я не знаю "лучших практик" для таких вещей. Я знаю, как решить конкретную проблему, но общий «лучший способ» - слишком расплывчатый вопрос.
Лямбда-выражения можно легко создать через пространство имен System.Linq.Expressions.
Я не могу рекомендовать выше, чем вы, читая сообщения Барта Де Смета (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.
Совершенно красивый код.
System.Linq.Expressions - это то, что вам нужно. Я написал красивый пользовательский интерфейс, который позволяет пользователям динамически определять и строить запросы в виде дерева выражений. Затем вы можете передать это Linq2SQL или клиенту по вашему выбору.
Хороший совет. Мы сделали это для настройки рабочих процессов, и это работает довольно хорошо.