7

我正在寻找一种在 C# 中针对不同提供者编写 SQL 语句的方法。区分 SQL 语句的一个典型示例是PostgreSQL 中的 LIMITMSSQL 中的 TOP

解决上述两种 SQL 语法的唯一方法是根据用户选择的提供程序或使用 try catch 语句作为流控制来编写 if 语句(LIMIT 不起作用,我将尝试 TOP 代替)?我见过LINQ Take方法,但我想知道如果没有 LINQ 是否可以做到这一点?

换句话说,C# 是否有一些我找不到可以使用的通用 SQL Provider 类?

4

5 回答 5

7

实体框架能够针对不同的数据库。这将允许您编写适用于两个数据库的 LINQ 语句。您需要为实体框架找到一个 postgresql 提供程序。有几种可供选择。

希望这可以帮助。

于 2010-05-30T10:47:31.203 回答
3

DBLinq

适用于 Oracle、PostgreSQL、MySQL、Ingres、SQLite、Firebird 和 ... SQL Server (C# 3.0) 的 LINQ 提供程序

使用 LINQ to SQL 生成查询时,可以查看生成的 SQL 并将其保存。

但是,它不符合您“不使用 LINQ”的要求。如果您有可用的 LINQ,为什么不使用它呢?

于 2010-05-30T10:46:49.367 回答
3

我认为没有“通用 sql 提供程序”。

在我们的商店中,我们需要同时支持 DB2 和 SQL Server,因此我们选择实现创建模型、数据访问和业务逻辑类的层模式。数据访问层处理与不同 DBMS 的连接并加载模型类,将它们传递回业务逻辑。业务逻辑和模型类不知道数据访问层从哪里获取数据。

由于数据访问层调用数据库中的存储过程,因此处理了 SQL 中的差异。我们在两个系统中都使用适当的语法实现了存储过程。如果我们需要转到另一个数据库,我们需要做的就是在新的 DBMS 上实施必要的过程,一切都应该正常工作。

于 2010-05-30T13:45:50.347 回答
1

加入 Marc Tidd 的想法 - 如果您不想要 Linq,请为每个提供程序创建单独的 DAL 类,或者使用将在每个 DB 上实现的存储过程。

于 2010-05-30T13:51:17.470 回答
0

由于某种原因,我不喜欢 linq 作为查询接口,并且前段时间开始创建一个 sql 生成库。看看 LambdaSql。目前它包含select子句和where过滤器的基本场景。已经支持设置字段、where、group by、have、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

于 2018-09-09T21:50:55.650 回答