2

このLinqExtensionクラスを作成して、LinqにLikeメソッドを提供します。「%a%b%」のような検索を実行したいので、Containsは役に立ちません。StackOverFlowで、SqlFunctionクラスのメソッドPatIndexを使用してEntityFrameworkで検索している投稿がいくつか見つかりました。

クリーンなコードを維持し、簡単に再利用できるようにするために、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));

それを適切に行うために何が欠けていますか?

4

1 に答える 1

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 );
}
于 2012-05-21T17:10:38.893 に答える