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

Silverlight/Tips 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도 소개되어 있으니 참고하세요.

설정

트랙백

댓글

  • 준형 2009.12.02 14:24 신고 ADDR 수정/삭제 답글

    그러고 보니 LINQ도 배워야 하는군요.
    싸우자! LINQ >_<
    PS- 길버트님 블로그에 좋은 글이 많아서 온종일 봐버렸어요. 헉!
    늦게 시작한 만큼 배울 게 많아 즐겁답니다. ^^(말로만 표정은 ㅜ.ㅜ)

    • BlogIcon 길버트 2009.12.02 16:06 신고 수정/삭제

      준형님 반갑습니다.
      LINQ랑 열심히 싸우셔서 좋은 결과 있기를 바래요.
      파이팅!

  • 유진상 2011.03.22 13:25 신고 ADDR 수정/삭제 답글

    궁금한게 있는데요

    위 소스중

    FUNC >>>> Func

    expr1.Parameters.Cast<EXPRESSION> ()); >>>>> expr1.Parameters.Cast<Expression> ());

    으로 바꿔야하는거죠?

    • 길버트 2011.03.22 18:11 신고 수정/삭제

      제 브라우저에서 확인하기로는 그렇게 대문자로 표시된 부분이 없는데요.
      혹시 그렇게 보이신다면 말씀하신대로 고치시는 것 맞습니다.