Silverlight/Tips

LINQ 사용 시 동적으로 where 문을 작성하고 싶을 때

길버트리 2009. 11. 17. 21:06
구글링을 열심히 한 결과, stackoverflow.com에서 답을 찾았네요.

PredicateBuilder 클래스를 활용하라는 답이 가장 호응이 좋았는데요.
아래 O'Reilly에서 나온 C# 3.0 IN A NUTSHELL 사이트의 어떤 페이지로 이끌더군요.
원문은 그곳을 참조하시면 됩니다.

Dynamically Composing Expression Predicates

자신의 프로젝트에 아래와 같이 PredicateBuilder 클래스를 추가하고,
using System;
using System.Linq;
using System.Linq.Expressions;
using System.Collections.Generic;
 
public static class PredicateBuilder
{
  public static Expression> True ()  { return f => true;  }
  public static Expression> False () { return f => false; }
 
  public static Expression> Or (this Expression> expr1,
                                                      Expression> expr2)
  {
    var invokedExpr = Expression.Invoke (expr2, expr1.Parameters.Cast ());
    return Expression.Lambda>
          (Expression.OrElse (expr1.Body, invokedExpr), expr1.Parameters);
  }
 
  public static Expression> And (this Expression> expr1,
                                                       Expression> expr2)
  {
    var invokedExpr = Expression.Invoke (expr2, expr1.Parameters.Cast ());
    return Expression.Lambda>
          (Expression.AndAlso (expr1.Body, invokedExpr), expr1.Parameters);
  }
}

사용은 다음과 같이 합니다.
IQueryable SearchProducts (params string[] keywords)
{
  var predicate = PredicateBuilder.False();

  foreach (string keyword in keywords)
  {
    string temp = keyword;
    predicate = predicate.Or (p => p.Description.Contains (temp));
  }
  return dataContext.Products.Where (predicate);
}

검색 조건이 다양할 때 조건문과 함께 사용하면 더 빛을 발하겠습니다!
'얼렁뚱땅은 싫다 자세히 이해하고 싶다!'는 분은 위에 소개한 원문 링크를 따라 들어가 보시면,
유익한 정보가 있습니다.

LINQ Query 연습할 때 사용하면 좋은 LINQPad도 소개되어 있으니 참고하세요.