2011-09-07 45 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); 
} 

請通過the thread for detailed answer

+0

這不適合我的工作,因爲它實際上生成「或」 T-SQL,它會拋出StackOverflow的異常,如果「列表」太大(例如,含有較多超過5000個元素),因爲表達式樹太大。 我想要的是在EF4中生成「IN」T-SQL。 –

+0

@Kevin修復了MSDN的鏈接。請通過線程 – Eranga