2012-03-08 63 views
0

我在我的UI中構建了一個尋呼機,當它涉及到其緩存結果的末尾時,它將在另一個窗口中重用DataServiceQuery<MyEntityType>。我目前的實現嘗試做這樣的事情:是否有可能在構建DataServiceQuery後進行修改?

query = query.Skip(index*page_size).Take(page_size) 

哪裏查詢以前使用動態LINQ查詢定義:

query = Where(queryString, queryValues.ToArray()).Take(page_size) 

這引發NotSupportedException:頂部後不能指定跳過查詢選項查詢選項。

有沒有辦法刪除DataServiceQuery的Take(頂部)部分,然後添加Skip(),然後重新添加Take()?

回答

1

您可以操縱IQueryable(DataServiceQuery實現IQueryable)中的表達式樹。例如:

DemoService ctx = new DemoService(new Uri("http://services.odata.org/OData/OData.svc/")); 
DataServiceQuery<Product> products = ctx.Products; 

DataServiceQuery<Product> q = (DataServiceQuery<Product>)products.Where(p => p.Name == "Bread").Skip(10); 
MethodCallExpression skipCall = (MethodCallExpression)q.Expression; 
q = (DataServiceQuery<Product>)q.Provider.CreateQuery<Product>(skipCall.Arguments[0]); 
Console.WriteLine(q); 

此代碼在最後使用Skip構造查詢。然後它將查詢並從中刪除跳過。請注意,這是「hacky」,因爲它依賴於Skip is last(直接轉換爲MethodCallExpression)。

相關問題