我正在我的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()?
答案 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)。