2012-03-08 17 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"으로 직접 캐스트)에 의존한다는 점에서 "해킹"입니다.

관련 문제