C# 在构造DataServiceQuery之后,是否可以对其进行更改?

C# 在构造DataServiceQuery之后,是否可以对其进行更改?,c#,linq,entity-framework,wcf-data-services,dynamic-linq,C#,Linq,Entity Framework,Wcf Data Services,Dynamic Linq,我正在我的UI中构建一个寻呼机,在缓存结果结束时重用另一个窗口中构建的DataServiceQuery。我当前的实现尝试执行以下操作: query = query.Skip(index*page_size).Take(page_size) 其中,先前使用动态LINQ查询将查询定义为: query = Where(queryString, queryValues.ToArray()).Take(page_size) 这会引发NotSupportedException:不能在top query选

我正在我的UI中构建一个寻呼机,在缓存结果结束时重用另一个窗口中构建的
DataServiceQuery
。我当前的实现尝试执行以下操作:

query = query.Skip(index*page_size).Take(page_size)
其中,先前使用动态LINQ查询将查询定义为:

query = Where(queryString, queryValues.ToArray()).Take(page_size)
这会引发NotSupportedException:不能在top query选项之后指定skip query选项


是否有方法删除DataServiceQuery的Take(顶部)部分,然后添加Skip(),然后重新添加Take()?

您可以在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);
DemoService ctx=新的DemoService(新的Uri(“http://services.odata.org/OData/OData.svc/"));
dataservicequeryproducts=ctx.products;
DataServiceQuery q=(DataServiceQuery)products.Where(p=>p.Name==“Bread”).Skip(10);
MethodCallExpression skipCall=(MethodCallExpression)q.Expression;
q=(DataServiceQuery)q.Provider.CreateQuery(skipCall.Arguments[0]);
控制台写入线(q);
这段代码构造了一个末尾带有Skip的查询。然后它接受查询并从中删除跳过。请注意,这是“hacky”,因为它依赖于最后一个跳过(直接转换为MethodCallExpression)