Преобразовать строку в запрос linq - PullRequest
3 голосов
/ 07 января 2010

Я играл с LINQPad и мне было любопытно, как я могу реализовать подобное поведение в своем собственном приложении, а именно: как я могу позволить пользователю вводить запрос LINQ в отношении известного контекста базы данных в виде строки, а затем запускать этот запрос вприложение?

Например, если у меня в приложении есть текст данных LINQ-to-SQL для базы данных Northwind, я хочу, чтобы у пользователя была возможность набирать

from cust in Customers
where cust.City == "London"
select cust;

ИЯ верну результаты вызова .ToList () по этому запросу.

Любые идеи / советы / ссылки?

Спасибо, любезно

Мустафа

Ответы [ 4 ]

4 голосов
/ 07 января 2010

Пространство имен System.CodeDom может сделать то, что вы ищете.Прочтите этот пост в блоге:

http://blogs.msdn.com/lukeh/archive/2007/07/11/c-3-0-and-codedom.aspx

Хотя вместо public static void Main вы можете скомпилировать статический метод, который принимает класс DataContext и возвращает IEnumerable, используя предоставленный запрос LINQ.Или все, что работает.

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

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

3 голосов
/ 07 января 2010

Вы можете увидеть, как именно LINQPad делает это, используя .NET Reflector для дизассемблирования исполняемого файла (LINQPad не является открытым исходным кодом). Они даже упоминают об этом в своей лицензии:

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

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

1 голос
/ 07 января 2010

Предлагаю заглянуть в исходный код "Snippy", замечательного инструмента из книги Джона Скита "C # подробно" . Вы можете скачать его с веб-сайта. Файл кода «Snippet.cs» содержит всего около 130 строк кода и содержит соответствующие части для компиляции кода на лету.

0 голосов
/ 05 февраля 2013

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

Это ваш запрос:

from cust in Customers
where cust.City == "London"
select cust;

Если вы хотите динамически изменить Lquery вместо cust.City == "London" на cust.Street == "London". Вы должны использовать оператор if-else, например, такой:

var lquery = (from cust in Customers
where cust.City == "London"
select cust).ToList();

if(true){
 lquery = (from cust in Customers
where cust.Street == "London"
select cust).ToList();
}

GridView.DataSource = lquery;
GridView.Databind();

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

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