ユーザが選択できるフィルタのセットを提供したいと思います。各フィルタはExpression<Func<X, bool>>
に対応します。したがって、私は利用可能な項目( 'Joe'、 'Steve'、 'Pete'など)の動的リストを取得し、それらの名前に基づいて「ハードコードされた」フィルタのコレクションを作成し、彼は彼が使用したいフィルターを使用します。私の問題は、ダイナミックリストの文字列値に基づいて式を「ハードコーディング」しようとしても、式は匿名型のハングオフプロパティとして値を格納していることです私はどのようにanonをシリアル化するのか分からない。申し訳ありませんが、これは混乱している場合、私はこれを明確にする方法はあまりよく分かりません。ここでLINQ:値ベースの参照を強制するには?
は私のサンプルコードです:
(x.Name = value(ConsoleApplication1.Program+<>c__DisplayClass3).value)
とき、私が本当に:
public class Foo
{
public string Name { get; set; }
}
static void Main(string[] args)
{
Foo[] source = new Foo[]
{
new Foo() { Name = "Steven" } ,
new Foo() { Name = "John" } ,
new Foo() { Name = "Pete" },
};
List<Expression<Func<Foo, bool>>> filterLst = new List<Expression<Func<Foo, bool>>>();
foreach (Foo f in source)
{
Expression<Func<Foo, bool>> exp = x => x.Name == f.Name;
filterLst.Add(exp);
}
}
}
私の問題は、私は私の式の本体を見たときに私が見たときに、次のように、それが読み込まということです最初のものは次のようになります。
(x.Name = "Steven")
(これに私のコードを変更すると、それは正確ですlyが、私は何を得る:
Expression<Func<Foo, bool>> exp = x => x.Name == "Steven";
)
は、私は式にそれを貼り付ける前に、ローカルの文字列値への私の値を強制的に試してみたが、助けていないようです:
List<Expression<Func<Foo, bool>>> filterLst = new List<Expression<Func<Foo, bool>>>();
foreach (Foo f in source)
{
string value = f.Name;
Expression<Func<Foo, bool>> exp = x => x.Name == value;
filterLst.Add(exp);
}
文字列に宣言されたローカル変数を使用していても、何らかの匿名型がまだ見えているのはなぜ(または実際どのように)わかりません。私が望むようにこの作品を作る方法はありますか?
(式ツリービルディングを表示する答えが更新されました) –
もっと複雑なシナリオを簡略化していますか?オブジェクトプロパティの配列をフィルタリングする簡単な方法があります。 –
@Jonas:はい、実際のシナリオをかなり単純化しました。私は常に定数の文字列に対してNameプロパティを常にフィルタリングするつもりはありません。私は実際にはもっと複雑なオブジェクトを扱っています。私は、ユーザーに異なるプロパティまたは複数のプロパティ条件に基づいているかもしれない複数の "フィルタ"コレクションを提供しています。最終的には、これらの「フィルタ」はすべて同じオブジェクトタイプ(式)に抽象化されます。これを最終的にクエリを生成するIQueryableソースリストに追加します。 –
Steven