2017-02-22 1 views
0

DataTable에 대한 동적 룩업 필터를 만들려고합니다.형식 호출 식 lambda linq where

코드는 현재 이와 같이 보이며 각 행/열을 반복합니다. 나는 row.Field<string>(ID)Expression.Call에 변환 할 관리하지 않는

DataRow FoundRow=null; 
      foreach (string ID in IDToCheck) 
     { 
         FoundRow = IdTable.AsEnumerable().Where(row => row.Field<string>(ID).Equals(
          RowInfo[ID].ToString(),StringComparison.InvariantCultureIgnoreCase)).First(); 
DoStuffWith(FoundRow); 
     } 

(하나 개의 테이블이 다른 하나를 먹이).

Microsoft의 예제를 재현하려고합니다.

+0

이 왜 그렇게 할 것입니다 :

하지만, 그냥 직접 질문에 대답하기 위해? 네가 가진 것에 뭐가 틀렸어? 실제로는 행이 = IDToCheck.Contains (row.Field (ID)))' –

+0

실제로는 명확하지 않지만 IDToCheck는 실제로 열 이름입니다. idtocheck'. 두 테이블 모두 공통으로 여러 열 이름이 있습니다. 첫 번째 ID가 테이블에서 발견되지 않으면 두 번째 ID와 다른 테이블의 다른 열을 찾습니다. (그것은 세돌, isin위한 것입니다 ...) – Yoyo

+0

그래,하지만 난 아직도 당신의 현재 코드와 함께 잘못 볼 수 없습니까? –

답변

1

실제로 성능 향상을 얻으려면 잘 모르겠습니다. "는 row.Field (ID)를 변환하는 Expression.Call하는"

IQueryable<DataRow> queryableData = IdTable.AsEnumerable().AsQueryable(); 

// Get the generice "Field<string>(string)" method from DataRowExtensions 
ParameterExpression pe = Expression.Parameter(typeof(DataRow), "row"); 
MethodInfo fieldMethod = typeof (DataRowExtensions).GetMethod("Field", new [] {typeof(DataRow),typeof(string)}); 
MethodInfo genericFieldMethod = fieldMethod.MakeGenericMethod(typeof (string)); 

Expression left = Expression.Call(null, genericFieldMethod, pe, Expression.Constant(col_name)); 
Expression right = Expression.Constant(value); 
Expression exp = Expression.Equal(left, right); 

IQueryable<DataRow> results = queryableData.Where(Expression.Lambda<Func<DataRow, bool>>(exp, pe));