ServiceStack.OrmLite在SQL.In过滤器中使用限制

时间:2017-06-22 19:34:47

标签: servicestack ormlite-servicestack

我有一个父/子表设置 - 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语句中工作。< / p>

    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));

在限制第一个选择中的结果时它起作用,但是当在子数据中使用时,我得到&#34;当子查询没有用EXISTS引入时,只能在选择列表中指定一个表达式。&#34 ;

出来的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子句中选择了多个列。是否有更好的方法来编写它以避免错误?

由于

1 个答案:

答案 0 :(得分:1)

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

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

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