2012-05-21 59 views
2

我們創建了此LinqExtension類以向Linq提供Like方法。包含對我們沒有用處,因爲我們想要執行像「%a%b%」這樣的搜索,在StackOverFlow中,我們發現了幾個使用SqlFunction類中的方法PatIndex與Entity Framework一起完成的文章。「爲lambda聲明提供的參數數量不正確」創建Lambda表達式

要保持乾淨的代碼和易於重複使用,我們正在嘗試做一個擴展方法來封裝PATINDEX呼叫

public static IQueryable<TSource> WhereLike<TSource>(
    this IQueryable<TSource> source, 
    Expression<Func<TSource, string>> valueSelector, 
    string value 
) 
{ 
    return source.Where(BuildLikeExpression(valueSelector, value)); 
} 

public static Expression<Func<TElement, bool>> BuildLikeExpression<TElement>(
    Expression<Func<TElement, string>> valueSelector, 
    string value 
) 
{ 
    if (valueSelector == null) 
    throw new ArgumentNullException("valueSelector"); 

    var method = GetLikeMethod(value); 

    var body = Expression.Call(method, valueSelector.Body, Expression.Constant(value)); 

    var parameter = valueSelector.Parameters.Single(); 
    var expressionConvert = Expression.Convert(Expression.Constant(0), typeof(int?)); 
    return Expression.Lambda<Func<TElement, bool>> (Expression.GreaterThan(body, expressionConvert)); 
} 

private static MethodInfo GetLikeMethod(string value) 
{ 
    var methodName = "PatIndex"; 
    Type stringType = typeof(SqlFunctions); 
    return stringType.GetMethod(methodName); 
} 

的問題是,當我們把這種新的方法,我們得到錯誤的對提供的參數數量不正確拉姆達聲明

return Expression.Lambda<Func<TElement, bool>> (Expression.GreaterThan(body, expressionConvert)); 

什麼是我們缺少做正確嗎?

回答

3

你快到了。

你有錯誤的順序呼叫表達的參數,您需要將參數傳遞到Expression.Lambda

public static Expression<Func<TElement, bool>> BuildLikeExpression<TElement>(Expression<Func<TElement, string>> valueSelector, string value) 
{ 
    if (valueSelector == null) 
     throw new ArgumentNullException("valueSelector"); 

    var method = GetLikeMethod(value); 

    var body = Expression.Call(method, Expression.Constant(value), valueSelector.Body); 

    var parameter = valueSelector.Parameters.Single(); 
    var expressionConvert = Expression.Convert(Expression.Constant(0), typeof(int?)); 

    return Expression.Lambda<Func<TElement, bool>>(Expression.GreaterThan(body, expressionConvert), parameter); 
} 
+0

它的工作原理!謝謝你的幫助! –

+0

不客氣:) –