Разобрать строку в запросе LINQ - PullRequest
10 голосов
/ 23 марта 2011

Какой метод будет считаться лучшей практикой для разбора строки LINQ в запросе?

Или, другими словами, какой подход имеет смысл преобразовать:

 string query = @"from element in source
                  where element.Property = ""param""
                  select element";

в

 IEnumerable<Element> = from element in source 
                        where element.Property = "param"
                        select element;

при условии, что source относится к IEnumerable<Element> или IQueryable<Element> в локальной области действия.

Ответы [ 6 ]

4 голосов
/ 20 июля 2016

Начиная с .NET 4.6 вы можете использовать CSharpScript для разбора Linq.Предполагая, что выражение, которое вы хотите проанализировать, находится в строковой переменной «query», это сделает это:

string query = "from element in source where element.Property = ""param"" select element";
IEnumerable result = null;
try 
{
    var scriptOptions = ScriptOptions.Default.WithReferences(typeof(System.Linq.Enumerable).Assembly).WithImports("System.Linq");
    result = await CSharpScript.EvaluateAsync<IEnumerable>(
             query,
             scriptOptions,
             globals: global);
} catch (CompilationErrorException ex) {
//
}

Не забудьте передать ваш источник (Data), с которым вы хотите работать, вместе с global-переменные для доступа к ним при разборе скрипта.

4 голосов
/ 23 марта 2011

Требуется некоторый анализ текста и интенсивное использование System.Linq.Expressions . Я немного поиграл с этим здесь и здесь . Код во второй статье несколько обновлен по сравнению с первой, но все еще грубоват. Я продолжал возиться с этим по случаю и имею несколько более чистую версию, которую я намеревался опубликовать, если у вас есть интерес. Я достаточно близок к поддержке хорошего подмножества ANSI SQL 89.

2 голосов
/ 23 марта 2011

Вам понадобится синтаксический анализатор языка C # (по крайней мере v3.5, возможно v4.0, в зависимости от того, какие функции языка C # вы хотите поддерживать в LINQ). Вы возьмете те результаты синтаксического анализа и передадите их непосредственно в дерево выражений, используя шаблон посетителя. Я еще не уверен, но готов поспорить, что вам также понадобится некоторая форма анализа типов для полной генерации узлов Expression.

Я ищу то же самое, что и вы, но мне это на самом деле не нужно так сильно, поэтому я не искал и не писал никакого кода по этим строкам.

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

Вот описание консольного инструмента, который я написал, LinqFilter:

http://bittwiddlers.org/?p=141

Вот исходный репозиторий. LinqFilter / Program.cs демонстрирует, как использовать компилятор для компиляции выражения LINQ:

http://bittwiddlers.org/viewsvn/trunk/public/LinqFilter/?root=WellDunne

2 голосов
/ 23 марта 2011

Это может работать для вас: C # eval эквивалент?

1 голос
/ 23 марта 2011

Это может или не может вам помочь, но посмотрите Библиотека динамических запросов LINQ .

0 голосов
/ 23 марта 2011

Хотя это и не дает конкретного примера для ответа на ваш вопрос, я бы подумал, что лучшая практика, как правило, заключается в построении дерева выражений из строки.

В этот вопросЯ спросил, как отфильтровать запрос linq со строкой, которая показывает, как вы строите часть дерева выражений.Однако эту концепцию можно расширить, чтобы построить целое дерево выражений, представляющее вашу строку.

См. Эту статью от Microsoft .

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

...