2013-01-01 8 views
3

완벽하게 작동하지만 한 가지 예외가있는 LINQ-Provider를 작성했습니다. LINQ-Query를 ODATA-URL 표준으로 변환합니다.ParameterExpression을 실제 식으로 해결하십시오.

나는 다음과 같은 LINQ 문이있는 경우 :

.Select(x => x.Name.ToLower()).OrderByDescending(x => x) 

를 내가 표현 방문자와 식 트리를 방문하고 때, 나는 ParameterExpression입니다 형 식 부분 (OrderByDescending)를 얻을 수 있습니다.

IntelliSense for ParameterExpression

내 질문은 지금 : 어떻게 선택 x.Name.ToLower() 표현에받을 수 있나요? 내가

$orderby=tolower(Name) desc 

// 편집 해 orderBy 문을 변환 할 수 있도록 : 다른 말로 : 을 나는 ParameterExpression {X => X}를 가지고있다. ?

1) LINQ 표현은 위의 의미하지 않는다/엔티티 $ ORDERBY = :이 표현은 {X => x.Name.ToLower()} 코드와

답변

1

두 문제를 해결하려면 tolower (Name) desc. 실제로 OData로 변환 할 방법이 없습니다. LINQ 쿼리는 모든 엔터티를 가져 와서 Name 속성을 가져 와서 낮은 사례 수의 문자열 (이름) 목록을 반환합니다. 또한 목록을 정렬합니다 (내림차순).

Call OrderBy 
- Argument 1 = Call Select 
    - Argument 1 = Entities 
    - Argument 2 = Lambda with parameter x(1) 
     Body = ToLower(x(1).Name) 
- Argument 2 = Lambda with parameter x(2) 
    Body = x(2) 

X (1), X (2) 선택의 람다에 매개 변수를 대표하고있는 OrderBy 호출 ParameterExpression 노드입니다 :

2) 식의 식 트리처럼 보인다. x (2)를 Select (ToLower (x (1) .Name))의 람다 본문으로 교체하면 작동하지 않습니다. 우선 그 몸에는 x (1) 매개 변수가 있으며, 두 번째 람다의 의미에서 의미가 없습니다. 둘째, 그것은 표현의 의미를 바꿀 것입니다.

은 $ ORDERBY = tolower를 (이름) 내림차순를 얻으려면 입력에 LINQ 표현은 같은 모양해야합니다 :

Entities.OrderByDescending(x => x.Name.ToLower()) 
+0

그래서이 결합 할 기회가 없다?.OrderByDescending (x => x.Name.ToLower())를 사용할 때 슬프다. (x => x.Name.ToLower()) 모두 잘 작동한다. –

+0

어떻게 OData로 변환하겠습니까? 동일한 문제가 있습니까? OData에는 Select (x => x.Name.ToLower())와 동일한 작업을 수행 할 수있는 구문이 없습니다. 결합은 가능하지만 방문객은 OrderBy와 Select를 동시에보고 둘을 하나의 작업으로 결합 할 수 있어야합니다. 이 두 단계를 하나의 단계에서 다른 단계로 쉽게 전송할 수 없으므로이를 별도의 단계로 처리하는 것이 문제입니다 (느슨한 의미). –