构建之后是否可以更改DataServiceQuery?

时间:2012-03-08 22:52:35

标签: c# linq entity-framework wcf-data-services dynamic-linq

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

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

其中先前使用动态LINQ查询定义查询:

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

抛出NotSupportedException:在顶部查询选项之后无法指定跳过查询选项。

有没有办法删除DataServiceQuery的Take(top)部分,然后添加Skip(),然后重新添加Take()?

1 个答案:

答案 0 :(得分: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。请注意,这是“hacky”,因为它依赖于Skip为last(直接转换为MethodCallExpression)。