Универсальный SQL builder.NET
Я ищу способ написать инструкцию SQL в C#, ориентированную на разных поставщиков. Типичным примером дифференцирования операторов SQL является ограничение в PostgreSQL и топ в MSSQL.
- единственный способ решить SQL-синтаксис, как два выше, чтобы написать if-операторы в зависимости от того, какой поставщик пользователь выбирает или использует операторы try catch в качестве управления потоком (предел не работал, я попробую TOP вместо)? Я видел в LINQ Взять метод, но мне интересно, можно ли это сделать без LINQ?
другими словами, есть ли у C# какой-то общий класс поставщика SQL, который я не смог найти, который можно использовать?
5 ответов
Entity Framework может использовать различные базы данных. Это позволит вам писать операторы LINQ, которые будут работать с обеими базами данных. Вам нужно будет найти поставщика postgresql для Entity Framework. Есть несколько на выбор.
надеюсь, что это помогает.
здесь DBLinq:
поставщик LINQ для Oracle, PostgreSQL, MySQL, Ingres, SQLite, Firebird и ... SQL Server (C# 3.0)
при создании запроса с помощью LINQ to SQL можно просмотреть сгенерированный SQL и сохранить его.
Это не соответствует вашему требованию "без использования LINQ". Если у вас есть LINQ, почему бы не использовать его?
Я не думаю, что есть"общий поставщик sql".
в нашем магазине нам нужно поддерживать DB2 и SQL Server, поэтому мы решили реализовать шаблон слоя, создающий модель, доступ к данным и классы бизнес-логики. Уровень доступа к данным обрабатывает подключение к различным СУБД и загружает классы моделей, передавая их обратно в бизнес-логику. Бизнес-логика и классы моделей понятия не имеют, где слой доступа к данным получает данные.
различия в SQL обрабатываются, поскольку уровень доступа к данным вызывает хранимые процедуры в базе данных. У нас есть хранимые процедуры, реализованные с соответствующим синтаксисом в обеих системах. Если нам нужно перейти в другую базу данных, все, что нам нужно сделать, это реализовать необходимые процедуры на новых СУБД, и все должно просто работать.
присоединение к идее Марка Тидда - Если вы не хотите Linq, создайте отдельные классы DAL для каждого поставщика или используйте хранимые процедуры, которые будут реализованы в каждой БД.
по какой-то причине мне не нравится linq как интерфейс запроса и некоторое время назад начал создавать библиотеку генерации sql. Взгляните на LambdaSql.
На данный момент он содержит основные сценарии для select
п. и where
фильтры. Настройка полей, где, group by, having, order by, joins, вложенные запросы уже поддерживаются. Вставка, обновление и удаление будут поддерживаться позже. Он также содержит некоторые моменты для расширения существующего поведения. Например Limit
реализуется таким образом.
пример:
var qry = new SqlSelect
(
new SqlSelect<Person>()
.AddFields(p => p.Id, p => p.Name)
.Where(SqlFilter<Person>.From(p => p.Name).EqualTo("Sergey"))
, new SqlAlias("inner")
).AddFields<Person>(p => p.Name);
Console.WriteLine(qry.ParametricSql);
Console.WriteLine("---");
Console.WriteLine(string.Join("; ", qry.Parameters
.Select(p => $"Name = {p.ParameterName}, Value = {p.Value}")));
выход:
SELECT
inner.Name
FROM
(
SELECT
pe.Id, pe.Name
FROM
Person pe
WHERE
pe.Name = @w0
) AS inner
---
Name = @w0, Value = Sergey
подробнее здесь https://github.com/Serg046/LambdaSql