2017-06-22 15 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

相關問題