2010-07-07 2 views
2

모든 확장 메서드가 제공된 후에 람다 식으로 작성된 조건부가 있습니다. 예를 들어 :Linq 표현식 매개 변수 유형 바꾸기

(new List<string>).Where(i => i.Contains("some")).Where(i => i.Contains("second_some")); 

"목록 <>"유일한 예는, 내 사용자 지정 데이터 컨텍스트 또는 개체 모음이있을 수 있습니다. 그래서 "Expression < ...>"을 가지고 있으며 기본 유형 "Expression"입니다.

질문은 표현 트리를 따라갈 수있는 코드가 있으며, 매개 변수 유형 (이 샘플에서는 "문자열")을 다른 하나와 함께 바꿀 수 있습니까?

매개 변수 유형을 바꾸는 방법을 이미 찾았지만 "Where"확장 메서드의 메서드에서 이전 매개 변수 형식의 서명이있는 경우 충돌이 발생합니다.

어쩌면 누군가가 해결책을 찾았습니까? 감사합니다. .

+0

이 경우에 무엇을하고 싶은지 확실하지 않습니다 ... "일부"는 당신이 무엇을하던간에 문자열이 될 것이기 때문에 만약 당신이 (int) '? –

+0

예를 들어 "string"이 아니라 "IUser"인터페이스가 있으며 linq2sql은 SQL 문자열을 작성하기 위해 클래스로 작업하기 때문에 "User"클래스가 필요합니다. 따라서 IUser를 User로 바꿔야합니다. –

+0

런타임에 형식을 알지 못하는 표현식을 만들고 Lamba 'template'메서드를 작성하고 싶습니까? –

답변

-1

표현식은 변경 불가능한 유형입니다. 매개 변수 (및 매개 변수 유형)를 바꾸려면 사용하려는 매개 변수를 전달하면서 원래 식의 본문을 사용하여 새 식을 만들어야합니다.

  var resultingIQueryable = (new List<string>()).AsQueryable<string>().Where (i => i.Contains ("some")).Where (i => i.Contains ("second_some")); 

      // the Queryable.Where is a MethodCallExpression 
      var expressionOriginal = resultingIQueryable.Expression as MethodCallExpression; 
      // there are multiple where calls, this makes it all a little bit more confusing. 
      // The linq tree is built 'backwards' 
      // the first parameter of the expression is a MethodCallExpression: 
      // {System.Collections.Generic.List`1[System.String].Where(i => i.Contains("some"))} 
      // the second parameter: 
      // {i => i.Contains("second_some")} 
      // 
      // disecting the first parameter you will again find 2 parameters: 
      // {System.Collections.Generic.List`1[System.String]} 
      // {i => i.Contains("some")} 

linq (메소드) 구문을 사용하여 표현식을 작성한 다음 트리를 걸어 새로운 표현식을 작성하는 것은 좋지 않습니다. 만약 내가 당신이라면 Expression.Call & Expression.Lambda & Expression.Paremeter ... 구문을 사용하여 표현식을 만들려고합니다.