2017-06-22 17 views
3

我有一个父/子表设置 - Items/ItemDetails。这部分工作:ServiceStack.OrmLite在SQL.In中使用限制过滤器

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(跳过行)函数在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)); 

它工作在第一选择限制的结果时,但在子数据中使用时拉我得到“只有一个表达式可以在选择列表中指定时不引入子查询与存在。”

散发出来改变其中子查询的SQL:

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

如果你使用SQL Server 2012或更高版本,你应该使用SqlServer2012Dialect.Provider,如:

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

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

+0

我们仍然有尚未升级到2008 R2以上的旧用户。 – Mark

相关问题