Разбор строки выражения C # LINQ - PullRequest
15 голосов
/ 24 сентября 2010

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

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

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

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

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

Ответы [ 2 ]

20 голосов
/ 24 сентября 2010

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

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

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

  3. Использовать компилятор Mono, который генерирует MSIL напрямую (поэтому сборка не выполняется для каждой компиляции и намного быстрее) - Mono Compiler as a Service (MCS)

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

0 голосов
/ 24 сентября 2010

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

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