【问题标题】:ServiceStack.OrmLite Using Limit in SQL.In filterServiceStack.OrmLite 在 SQL.In 过滤器中使用限制
【发布时间】:2017-06-23 03:41:57
【问题描述】:

我有一个父/子表设置 - Items/ItemDetails。这部分有效:

    var q = db.From<Item>(); //various where clauses based on request
    items = db.Select<Item>(q);
    q = q.Select(a => a.ITEM_NO);
    itemDetails = db.Select<ItemDetail>(x => Sql.In(x.ITEM_NO, q));

尝试添加分页以提高对大型数据集的请求的性能,我无法让 .Limit(skip, rows) 函数在子表的 SQL.In 语句中工作。

    var q = db.From<Item>().Limit(skip, rows);
    items = db.Select<Item>(q);
    q = q.Select(a => a.ITEM_NO);
    itemDetails = db.Select<ItemDetail>(x => Sql.In(x.ITEM_NO, q));

在第一次选择中限制结果时有效,但在子数据拉取中使用时,我得到“当不使用 EXISTS 引入子查询时,选择列表中只能指定一个表达式。”

出来的SQL把where子查询改成:

    WHERE "ITEM_NO" IN (SELECT * FROM (SELECT  "ITEM_NO", ROW_NUMBER() OVER 
    (ORDER BY "ITEM"."ITEM_NO") As RowNum  
    FROM "ITEM") AS RowConstrainedResult WHERE RowNum > 5 AND RowNum <= 15)

我了解 SQL 错误是因为我在 IN 子句中选择了多个列。有没有更好的方法来写这个以避免错误?

谢谢

【问题讨论】:

    标签: servicestack ormlite-servicestack


    【解决方案1】:

    如果您使用的是 SQL Server 2012 或更高版本,则应使用SqlServer2012Dialect.Provider,例如:

    container.Register<IDbConnectionFactory>(c => 
        new OrmLiteConnectionFactory(connString, SqlServer2012Dialect.Provider)); 
    

    这让 OrmLite 可以使用 SQL Server 2012 中添加的分页支持,而不是诉诸使用为早期版本的 SQL Server 实现分页所需的窗口函数破解。

    【讨论】:

    • 我们仍有未升级到 2008 R2 之后的旧用户。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-31
    • 2011-10-11
    • 1970-01-01
    • 2011-03-04
    • 2014-02-22
    • 2012-11-28
    • 1970-01-01
    相关资源
    最近更新 更多