Как применить SQL-запрос к C# DataTable/Dataset?
У меня есть приложение, где пользователи могут вводить SQL-запрос в виде текста, и мне нужно запустить его против C# DataTable/Dataset внутри моего приложения. Можно ли это сделать?
изменить: Основываясь на ответах и некоторых других исследованиях, это невозможно сделать - нет способа применить SQL-запрос к таблице, которую вы уже прочитали в своем приложении. Посмотрите на ответы для возможных обходных путей.
редактирование 2: Конечным решением в моем случае была реализация простого парсера с использованием ANTLR. Это позволило пользователям вводить простые запросы, используя ключевые слова "И", "ИЛИ", а также круглые скобки. Сгенерированный ANTLR класс преобразует это в набор инструкций, которые я мог бы использовать для запроса набора данных C#.
2 ответов
Если ваши пользователи будут вводить что-либо, кроме простейших операторов select, вам будет очень сложно это сделать. Я предполагаю, что для вашего проекта было бы непомерно дорого написать полный парсер для SQL, но это, по сути, то, о чем вы говорите.
для домашнего ORM, который у нас есть, у меня есть класс, который преобразует по существу предопределенные SQL-запросы в то, что можно использовать с DataTable.Select
, но предложение where генерируется из SqlParameters.
Возможное Решение
возможно, вы можете объединить следующие проекты, чтобы приблизиться к тому, что вам нужно:
Linqer (конвертер SQL в LINQ) затем LINQ to DataSet
Я сам не использовал Linqer.
какие-то другие мысли
Я уверен, что вы думали об этом, но сложность этого, возможно, означает, что есть лучше, если ты немного уменьшишь масштаб. Строго говоря, запрос кэша с неизвестным запросом означает, что вам придется заполнить кэш всеми возможными данными или иметь возможность вызывать эти данные при отправке запроса. По определению, это не может обеспечить лучшую производительность, чем прямой запрос источника, если вы не нажмете кэш достаточно, прежде чем он устареет, чтобы сделать это стоящим. Для специальной системы отчетности (мое предположение), я склонен сомневаться, что это так, и я бы беспокоиться что он не будет превосходить СУБД в очень крайних случаях.
@JoshC также упоминает возможность с Sqlite, и есть также SQL Server 2012 LocalDB, который может соответствовать счету, хотя это, конечно, не наборы данных .net.
Если вы хотите запустить строку поиска против c# datatable / dataset внутри вашего приложения
вы можете использовать выражение фильтра в select
метод.
myDataTable.Select("columnName1 like '%" + value + "%'");