関係するメンバーがコンパイル時にわからない場合、どのようにして述語式ツリーを作成できますか?

私は述語のために書く必要がある表現を持っています:

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

しかし、テストするメンバ(この例では .Number )はコンパイル時には分かりません( string パラメータになります)。

私は試した:

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

しかし、それはうまくいかなかった。この場合、どのようにして述部を作成できますか?

0
e.Number - int。私は述語が必要です、私は名前フィールドがありません
追加された 著者 Mediator,
まず、あなたが達成しようとしていることを文章で説明することから始めましょう。また、トピックから離れて、私は "なぜあなたは何かをしようとしている"と答えた。
追加された 著者 Wim Ombelets,
現在何が起こっていますか?あなたが持っている最初の行に何が間違っているのですか?すなわち、なぜ何かを試みているのですか?最初の行で問題とは何ですか?そして、 e.Number のタイプは何ですか?
追加された 著者 Marc Gravell,

1 答え

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

static Expression> BuildPredicate(
    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>(contains, arg);
}

使い方:

var predicate = BuildPredicate("Number", "6");
var filtered = data.Where(predicate);
1
追加された
あなたは優秀!!!
追加された 著者 Mediator,