2012-03-08 5 views
0

自分のUIに、キャッシュされた結果の最後に別のウィンドウに組み込まれたDataServiceQuery<MyEntityType>を再利用するページャーを構築しています。私の現在の実装では、のような何かをしようとします。DataServiceQueryを構築した後でDataServiceQueryを変更することはできますか?

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

これはNotSupportedExceptionをスロー:スキップクエリオプションがトップの後に指定することはできませんクエリは以前のような動的LINQクエリを使用して定義された

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

クエリオプション。

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を使用してクエリを構成します。次に、クエリを取得してスキップを削除します。 Skipが最後になっている(MethodCallExpressionへの直接キャスト)という点で、これは「ハッキー」であることに注意してください。

関連する問題