Универсальный 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