フィルタリングのためにかなり大きな式ツリーに他のものと組み合わされるラムダ式を作成しようとしています。これは、サブコレクションプロパティでフィルタリングする必要があるまでうまく動作します。コレクションプロパティをフィルタリングするための動的式ツリーの構築
ルートオブジェクトのプロパティであるコレクションのプロパティでAny()を使用してフィルタリングするラムダ式を作成するにはどうすればよいですか?
例:
CurrentDataSource.Offices.Where(o => o.base_Trades.Any(t => t.Name == "test"))
これは私が静的表現を建設する方法ですが、私はそれを動的に構築する必要があります。混乱させて申し訳ありません。
編集:ここで私はあまり複雑な式の処理方法の抜粋です:
IQueryable<Office> officeQuery = CurrentDataSource.Offices.AsQueryable<Office>();
ParameterExpression pe = Expression.Parameter(typeof(Office), "Office");
ParameterExpression tpe = Expression.Parameter(typeof(Trades), "Trades");
Expression SimpleWhere = null;
Expression ComplexWhere = null;
foreach (ServerSideFilterObject fo in ssfo)
{
SimpleWhere = null;
foreach (String value in fo.FilterValues)
{
if (!CollectionProperties.Contains(fo.PropertyName))
{
//Handle singleton lambda logic here.
Expression left = Expression.Property(pe, typeof(Office).GetProperty(fo.PropertyName));
Expression right = Expression.Constant(value);
if (SimpleWhere == null)
{
SimpleWhere = Expression.Equal(left, right);
}
else
{
Expression e1 = Expression.Equal(left, right);
SimpleWhere = Expression.Or(SimpleWhere, e1);
}
}
else
{
//handle inner Collection lambda logic here.
Expression left = Expression.Property(tpe, typeof(Trades).GetProperty("Name"));
Expression right = Expression.Constant(value);
Expression InnerLambda = Expression.Equal(left, right);
//Problem area.
Expression OfficeAndProperty = Expression.Property(pe, typeof(Office).GetProperty(fo.PropertyName));
Expression OuterLambda = Expression.Call(OfficeAndProperty, typeof(Trades).GetMethod("Any", new Type[] { typeof(Expression) }),InnerLambda);
if (SimpleWhere == null)
SimpleWhere = OuterLambda;
else
SimpleWhere = Expression.Or(SimpleWhere, OuterLambda);
}
}
if (ComplexWhere == null)
ComplexWhere = SimpleWhere;
else
ComplexWhere = Expression.And(ComplexWhere, SimpleWhere);
}
MethodCallExpression whereCallExpression = Expression.Call(typeof(Queryable), "Where", new Type[] { officeQuery.ElementType }, officeQuery.Expression, Expression.Lambda<Func<Office, bool>>(ComplexWhere, new ParameterExpression[] { pe }));
results = officeQuery.Provider.CreateQuery<Office>(whereCallExpression);
表現ツリーを構築する方法を尋ねていますか? – SLaks
あなたの例で階層がどのように機能するかわかりません。あなたはもう少し詳しく説明できますか?オフィスはルートになっており、各オフィスには一連の取引がありますか?そして、あなたはトレードの名前をフィルタリングしたいですか?フィルターは、私が少し失った場所です。ごめんなさい。 –
いいえ、私は、内部メソッド呼び出しとパラメータ用の式で式を構築するために使用される構文が不明です。この場合、パラメータが定義と一致しないため、Any()が見つからないというエラーが表示されます。このケースでは、構文に賛同していないか、Any()がそれを使用している方法ではサポートされていないため、そのことがわかりません。 – George