2011-09-07 2 views

답변

1

다음은 MSDN 포럼에서 제공하는 솔루션입니다.

static Expression<Func<TElement, bool>> BuildContainsExpression<TElement, TValue>(
    Expression<Func<TElement, TValue>> valueSelector, IEnumerable<TValue> values) 
{ 
    if (null == valueSelector) { throw new ArgumentNullException("valueSelector"); } 
    if (null == values) { throw new ArgumentNullException("values"); } 
    ParameterExpression p = valueSelector.Parameters.Single(); 
    // p => valueSelector(p) == values[0] || valueSelector(p) == ... 
    if (!values.Any()) 
    { 
     return e => false; 
    } 
    var equals = values.Select(value => (Expression)Expression.Equal(valueSelector.Body, Expression.Constant(value, typeof(TValue)))); 
    var body = equals.Aggregate<Expression>((accumulate, equal) => Expression.Or(accumulate, equal)); 
    return Expression.Lambda<Func<TElement, bool>>(body, p); 
} 

는 실제로 "또는"T-SQL을 생성으로 이것은 나를 위해 작동하지 않습니다 the thread for detailed answer

+0

통해 이동하십시오하고 "목록"너무 큰 경우에 유래의 예외가 발생합니다 (예를 들어, 더 많은 것을 포함 표현식 트리가 너무 큽니다. 내가 원하는 것은 EF4에서와 같이 "IN"T-SQL을 생성하는 것입니다. –

+0

@Kevin이 MSDN 링크를 수정했습니다. 스레드를 통해 이동하십시오. – Eranga