2013-02-01 2 views
4

나는 필드 이름의 가변 수를 포함하는 명부가있다. 이 목록을 통해 루프를 수행하고 필드에 값이있는 모든 레코드를 필터링하는 조건부를 만들고 싶습니다.PredicateBuilder를 사용하면 필드 이름의 가변 길이 목록에서 술어를 작성하는 방법이 있습니까?

foreach (var field in FieldNames) 
      { 
      myPredicate= myPredicate.And(m => m.*field*!=null);      
} 

나는 이것을 수행하는 방법을 모르겠습니다. 어떤 제안?

TIA

답변

7

이 속성은 컴파일 시간에 무엇인지 경우에만 람다 표현식을 작성할 수 있습니다. 분야가 무엇인지를 분명히 알지 못하기 때문에 직접 수식을 만들어야합니다.

public Expression<Func<T, bool>> GenerateFieldNotNullExpression<T>(string fieldName) 
{ 
    var parameter = Expression.Parameter(typeof(T), "m"); 
    // m 
    var fieldAccess = Expression.PropertyOrField(parameter, fieldName); 
    // m.[fieldName] 
    var nullValue = Expression.Constant(null); 
    // null 
    var body = Expression.NotEqual(fieldAccess, nullValue); 
    // m.[fieldName] != null 
    var expr = Expression.Lambda<Func<T, bool>>(body, parameter); 
    // m => m.[fieldName] != null 
    return expr; 
} 

이 그런 다음 식을 만들려면이를 사용하여 그들을 연결 :

var predicate = PredicateBuilder.True<MyType>(); 
foreach (var fieldName in fieldNames) 
{ 
    var expr = GenerateFieldNotNullExpression<MyType>(fieldName); 
    predicate = predicate.And(expr); 
} 

당신은 표현을 생성하기 위해이 같은 도우미 함수가 필요합니다