Динамические выражения LINQ и динамические лямбда?

StackOverflow https://stackoverflow.com/questions/114029

  •  02-07-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

Я не могу порекомендовать вам больше, чем вы, прочитав сообщения Барта Де Смета (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

Совершенно красивый код.

Другие советы

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top