代码之家  ›  专栏  ›  技术社区  ›  thames

ServiceStack.OrmLite Select<>在使用WITH CTE时抛出npgsql语法错误

  •  1
  • thames  · 技术社区  · 11 年前

    从错误中我认为这是Npgsql的问题( see closed issue )然而,OrmLite Select<>因为它正在更改执行的sql。

    问题:

    1. 除了不使用WITH CTE之外,OrmLite中还有其他方法可以解决此错误吗?
    2. 是数据库。选择<>使用错误的命令?

    注意:WITH CTE与OrmLite.Scalar一起使用

    带有CTE的Postgres: http://www.postgresql.org/docs/current/static/queries-with.html

    更新:问题似乎是OrmLite在准备SQL语句,它不是以“SELECT”开头,这导致OrmLite将SQL作为“WHERE”参数处理。

    [Test]
    public void with_cte_ormlite_obj()
    {
        using (var db = DbConnection)
        {
            var sql = "WITH w_cnt AS (SELECT 5 AS cnt, 'me' AS name) SELECT cnt, name FROM w_cnt";
    
    // An exception of type 'Npgsql.NpgsqlException' occurred in Npgsql.dll
    // ERROR: 42601: syntax error at or near "WITH w_cnt"
    // Actual Exec Sql: 
    // SELECT "cnt", "name" FROM "my_with_cte_obj" WHERE WITH w_cnt AS (SELECT 5 AS cnt, 'me' AS name) SELECT cnt, name FROM w_cnt
    
            var cnt = db.Select<MyWithCteObj>(sql);
            var first = cnt.First();
            Assert.AreEqual(5, first.Cnt);
            Assert.AreEqual("me", first.Name);
        }
    }
    
    public class MyWithCteObj
    {
        public int Cnt { get; set; }
        public string Name { get; set; }
    }
    
    1 回复  |  直到 11 年前
        1
  •  2
  •   mythz    11 年前

    这个 db.Select<T>() API只能用于SQL 选择 声明。

    这个 db.SqlList<T>() API应用于非SELECT查询,例如:

    using (var db = DbConnection)
    {
        var cnt = db.SqlList<MyWithCteObj>(
            "WITH w_cnt AS (SELECT 5 AS cnt, 'me' AS name) SELECT cnt, name FROM w_cnt");
    }
    

    查看文档了解更多信息 custom SQL APIs examples .