Разбор строки С# LINQ выражение

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

У меня есть строка, содержащая выражение LINQ, например.

var s = "from a in queryable where a.Type == 1 select a";

Как я могу получить из этого IQueryable или выражения?

Я видел, как LINQPad и RavenDb делают это, поэтому я убежден, что есть способ, я его еще не нашел.

Ответы

Ответ 1

У вас есть несколько вариантов:

  • Сделайте что-то самодовольное, разбор текста и построение дерева выражений. Стандартным подходом к этому было бы использование парсера для синтаксического анализа строки (например, ANTLR).

  • Используйте CodeDOM для компиляции запроса (НЕ рекомендуется для среды производства, так как это медленно, и генерирует сборку для каждой компиляции, которая насытит ваш AppDomain с помощью сборок, если вы сделаете много. если у вас есть какой-то объем - хотя это и делает LINQPad) - http://social.msdn.microsoft.com/Forums/en-US/linqprojectgeneral/thread/6a4defd2-76f0-4865-97b7-130e4ba7b50a

  • Использовать компилятор Mono, который испускает MSIL напрямую (так что сборка не выполняется на сборку и намного быстрее) - Монокомпилятор как служба (MCS)

  • Используйте Dynamic LINQ (имеет некоторые ограничения и ограничения, но в основном делает то, что предлагается в пункте № 1, и является хорошим, легким и имеет возможность разрешать только определенные вызовы методов. Он анализирует текстовый запрос и создает Дерево выражений от него) - http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

Ответ 2

Переход от "магической строки" к объектам кода всегда включает в себя какой-то синтаксический анализ. В этом случае было бы лучше работать с библиотекой EditableExpression (доступной без Google Code). Возьмите свою строку и отформатируйте ее, чтобы выглядеть как результат сериализации серии EditableExpressions. Затем просто десериализуйте его и преобразуйте в дерево выражений.