0

述語のために書く必要のある式があります:

.Where(e => SqlFunctions.StringConvert((double?) e.Number).Contains("6")))

ただし、テストしたいメンバー(.Number例では)はコンパイル時に不明です(stringパラメーターになります)。

私は試した:

.Where(string.Format(
      "SqlFunctions.StringConvert((double?){0}).Contains(@0)", field), value);

しかし、それはうまくいきませんでした。この場合、どのように述語を作成できますか?

4

1 に答える 1

1

コンパイル時にメンバー名(Numberこの例では)がわからない場合は、式ツリーを手動で作成する必要があります。次に例を示します。

static Expression<Func<T, bool>> BuildPredicate<T>(
    string fieldName, string containsValue)
{
    var arg = Expression.Parameter(typeof(T), "e");
    var str = Expression.Call(typeof(SqlFunctions), "StringConvert", null,
        Expression.PropertyOrField(arg, fieldName));
    var contains = Expression.Call(str, "Contains", null,
        Expression.Constant(containsValue, typeof(string)));
    return Expression.Lambda<Func<T, bool>>(contains, arg);
}

使用法:

var predicate = BuildPredicate<Foo>("Number", "6");
var filtered = data.Where(predicate);
于 2013-02-07T10:49:02.040 に答える