我有一个父/子表设置 - 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子句中选择了多个列。是否有更好的方法来编写它以避免错误?
由于
答案 0 :(得分:1)
如果您使用的是SQL Server 2012或更高版本,则应使用SqlServer2012Dialect.Provider
,例如:
container.Register<IDbConnectionFactory>(c =>
new OrmLiteConnectionFactory(connString, SqlServer2012Dialect.Provider));
这使得OrmLite可以使用SQL Server 2012中添加的分页支持,而不是使用为早期版本的SQL Server实现分页所需的窗口函数hack。