Универсальный конструктор SQL .NET - PullRequest
7 голосов
/ 30 мая 2010

Я ищу способ написать оператор SQL в C # для разных поставщиков. Типичным примером дифференциации операторов SQL является LIMIT в PostgreSQL против TOP в MSSQL .

Это единственный способ решить SQL-синтаксис, подобный приведенным выше, для записи операторов if в зависимости от того, какого провайдера выбирает пользователь, или использования операторов try catch в качестве управления потоком ( LIMIT не работает, я попробую ТОП вместо )? Я видел LINQ Take метод, но мне интересно, можно ли это сделать без LINQ?

Другими словами, есть ли в C # какой-то общий класс SQL-провайдера, который мне не удалось найти и который можно использовать?

Ответы [ 5 ]

7 голосов
/ 30 мая 2010

Entity Framework может работать с разными базами данных. Это позволит вам писать операторы LINQ, которые будут работать с обеими базами данных. Вам нужно будет найти поставщика postgresql для Entity Framework. Есть несколько вариантов на выбор.

Надеюсь, это поможет.

3 голосов
/ 30 мая 2010

Я не думаю, что есть "универсальный поставщик SQL".

В нашем магазине нам нужна поддержка как DB2, так и SQL Server, поэтому мы решили реализовать шаблон слоев, создав классы Model, Data Access и Business Logic. Уровень доступа к данным обрабатывает соединение с различными СУБД и загружает классы модели, передавая их обратно в бизнес-логику. Бизнес-логика и классы моделей не имеют представления, где уровень доступа к данным получает данные.

Различия в SQL обрабатываются, потому что уровень доступа к данным вызывает хранимые процедуры в базе данных. У нас есть хранимые процедуры, реализованные с соответствующим синтаксисом в обеих системах. Если нам нужно перейти в другую базу данных, все, что нам нужно сделать, - это внедрить необходимые процедуры в новых СУБД, и все должно просто работать.

3 голосов
/ 30 мая 2010

Есть DBLinq :

Поставщик LINQ для Oracle, PostgreSQL, MySQL, Ingres, SQLite, Firebird и ... SQL Server (C # 3.0)

Когда вы генерируете запрос, используя LINQ to SQL, можно просмотреть сгенерированный SQL и сохранить его.

Это не соответствует вашим требованиям "без использования LINQ". Если у вас есть LINQ, почему бы не использовать его?

1 голос
/ 30 мая 2010

Присоединение к идее Марка Тидда - Если вы не хотите Linq, создайте отдельные классы DAL для каждого поставщика или используйте хранимые процедуры, которые будут реализованы в каждой БД.

0 голосов
/ 10 сентября 2018

По какой-то причине я не люблю linq как интерфейс запросов и начал создавать библиотеку для создания sql некоторое время назад. Посмотрите на LambdaSql. На данный момент он содержит базовые сценарии для select предложения и where фильтров. Задание полей, в которых сгруппированы, имеют, упорядочены по, объединения, вложенные запросы, уже поддерживаются. Вставка, обновление и удаление будут поддерживаться позже. Он также содержит некоторые пункты для расширения существующего поведения. Например, 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

...