Как построить запрос LINQ из текста во время выполнения? - PullRequest
10 голосов
/ 18 апреля 2010

у меня есть

class A {
   public int X;
   public double Y;
   public string Z;
   // and more fields/properties ...
};

и List<A> data и может создать запрос linq, например,

var q = from a in data where a.X > 20 select new {a.Y, a.Z};

Затем dataGridView1.DataSource = q.ToList(); отображает выбор в моем DataGridView.

Теперь вопрос, возможно ли построить запрос из текста, введенного пользователем во время выполнения? Как

var q = QueryFromText("from a in data where a.X > 20 select new {a.Y, a.Z}");

Дело в том, что пользователь (имеющий навыки программирования) может динамически и свободно выбирать отображаемые данные.

Ответы [ 5 ]

5 голосов
/ 18 апреля 2010

Динамический Линк Малыш!

r.e. комментарии.

Да, приведенный пример может быть невозможен при использовании Dynamic Linq, но если вы вычтете константы, например «из входных данных» у вас остаются «где» и «выбор», которые можно выразить динамическим linq.

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

Просто мысль.

У Джона есть интересный подход, но я бы опасался компилировать и выполнять неограниченный код.

4 голосов
/ 18 апреля 2010

Ну, вы можете использовать CSharpCodeProvider для компиляции кода во время выполнения. Посмотрите на Snippy для примера этого. В этом случае вам нужно скомпилировать код пользователя в методе, который принимает List<A> с именем data. Мой опыт показывает, что это работает, но это может быть немного неудобно, особенно с точки зрения добавления соответствующих ссылок и т. Д.

1 голос
/ 05 мая 2015

отвечаю довольно поздно; хотя, это поможет кому-то, кто посещает эту страницу.

У меня было похожее требование, и я решил его, динамически скомпилировав строку как запрос LINQ, выполнив ее при сборе в памяти и собрав результат. Единственный улов - пользовательский ввод должен быть корректным C # -компилируемым кодом, иначе он возвращает сообщение об исключении вместо результата.

Код довольно длинный, так что вот ссылка github

Пример приложения на github показывает несколько примеров, включая проекцию.

0 голосов
/ 11 июля 2011

проверить эту библиотеку http://msdn.microsoft.com/en-us/vcsharp/bb894665.aspx

0 голосов
/ 19 апреля 2010

Хотя могут быть некоторые способы сделать это, LINQ просто не предназначен для этого сценария. Использование CodeDOM (как предположил Джон), вероятно, единственный способ сделать это легко. Если вы доверяете пользователю и у него есть навыки программирования, возможно, вы могли бы просто использовать устаревшие методы и позволить пользователю вводить запрос с использованием SQL?

Если вы, с другой стороны, решили создать какой-то визуальный инструмент для построения запросов, вам не нужно создавать их, составляя строки, и вместо этого вы можете составлять деревья выражений. Например, используя Linq Kit и AsExpandable.

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