2

저는 현재 ASP Dynamic Data로 처음으로 작업 중이며 필터를 작성하려고합니다. 사용자는 항목이 선택한 상위 항목의 하위 항목인지 여부에 따라 목록의 항목을 찾아야합니다 (항목에 둘 이상의 상위 항목이있을 수 있음).IEnumerable <int>을 빌드하는 방법 .Contains() Expression?

해당 항목은 세그먼트이며 각 세그먼트에는 Segment의 모든 상위 ID를 모아 놓은 IEnumerable 유형의 RouteIds라는 속성이 있습니다.

내 필터에 GetQueryable 메서드를 재정이 점에 오긴했는데,하지만 난 표시된 마지막 줄에 던져 예외를 점점 계속 :

ConstantExpression ce = Expression.Constant(int.Parse(this.ddlRouteNames.SelectedValue)); 
ParameterExpression pe = Expression.Parameter(source.ElementType); 
MemberExpression me = Expression.Property(pe, this.Column.Name); 
var callExpression = Expression.Call(typeof(Enumerable), "Contains", new Type[] { me.Type }, ce, me); 

생각은 사용자가 적절한 경로를 선택할 것입니다 DropDownList에서 세그먼트의 RouteIds 속성에 해당 경로의 ID가 포함되어 있는지 확인합니다.

이 방법을 얻으려면 어떻게해야합니까? 'System.Linq.Enumerable'는 공급 형태 인수 및 인수와 호환 입니다

없음 일반적인 방법은 '포함되어 있지 않습니다'유형에 대한 -

편집 다음은 예외입니다. 메소드가 제네릭이 아닌 경우 인수 유형을 으로 제공해야합니다. 코드에서 두 가지 문제가 있습니다

+0

:

var callExpression = Expression.Call( typeof(Enumerable), "Contains", new[] { typeof(int) }, me, ce); 

그러나 당신의 표현의 모든 부분이 어쩌면, 실제로 같은 동적없는 것 같다 너무 일하는 것이 다음 아마도이 질문을 완전히 잘못 읽었을 것입니다. 그러나 LINQ 쿼리를 사용하면이 질문을 더 간단하게 처리 할 수 ​​있습니까? http://www.rapidprogramming.com/tutorial/C-Sharp-LINQ-Query-Expressions-375 – bUKaneer

+0

@bUKaneer, SQL 변환 가능한 LINQ 쿼리는 표현식 트리를 사용해야합니다. 때로는 컴파일러에서 해당 레그 워크를 수행하도록 할 수 있습니다. 다른 경우 (예 : OP의 예 :'this.Column.Name'처럼 런타임에 심볼 만 알면) 위와 같이 어려운 방법으로 표현식 트리를 만들어야합니다. –

+1

@SonnyBoy, 당신은 "계속 예외를 던지라고 말합니다."그러나 당신은 예외가 던져진 것을 우리에게 말하지 않습니다. –

답변

1

:

  1. 당신의 매개 변수를 거꾸로입니다. 첫 번째 매개 변수는 컬렉션이어야하며 두 번째 매개 변수는 검색하려는 항목입니다.
  2. 유형 인수가 IEnumerable<int> 인 경우 int이어야합니다.

따라서, 고정 된 코드는 다음과 같습니다

Expression<Func<Segment, bool>> expression = 
    s => s.RouteIds.Contains(int.Parse(this.ddlRouteNames.SelectedValue)); 
+0

감사합니다. 더 이상 예외는 없지만 아직 내 접근 방식이 작동하는지 확인하지는 못했습니다. 그러나이 표현을 여러 가지 부모/자식 관계에 적용 할 것이므로 표현은 미래에는 동적 일 것입니다. –