3 Stimmen

Hinzufügen von LambaExpression zu einer Instanz von IQueryable

 ParameterExpression parameter = Expression.Parameter(typeof(Product), "x");
        MemberExpression Left = Expression.MakeMemberAccess(parameter, typeof(Product).GetProperty("Name"));
        ConstantExpression Right = Expression.Constant(value, typeof(String));
        BinaryExpression expression = Expression.Equal(Left, Right);
        LambdaExpression lambada = Expression.Lambda<Func<Product, bool>>(expression, parameter);

Nun, wie füge ich diese Lambada zu einer Instanz eines IQuerybale, sagen wir _query

_query.Where(lambada.Compile());?

3voto

Mike Two Punkte 42868

Ich denke, Sie müssen nur den Typ der lambda

ParameterExpression parameter = Expression.Parameter(typeof(Product), "x");
MemberExpression Left = Expression.MakeMemberAccess(parameter, typeof(Product).GetProperty("Name"));
ConstantExpression Right = Expression.Constant(value, typeof(String));
BinaryExpression expression = Expression.Equal(Left, Right);
Expression< Func< Product, bool > > lambda = Expression.Lambda<Func<Product, bool>>(expression, parameter);

Jetzt ist es eine Expression<Func<Product, bool>> y IQueryable.Where nimmt das als Argument. Expression.Lambda<TDelegate> gibt eine TDelegate die auch eine LambdaExpression weshalb Expression.Lambda Zeile kompiliert in Ihrem Fall und in meinem Fall, aber IQueryable.Where möchte es als eine Expression<Func<Product, bool>> .

Etwa so:

List< Product > products = new List< Product >
{
    new Product { Name = "bar" }, 
    new Product { Name = "foo" }
};
IQueryable< Product > queryable = products.AsQueryable().Where( lambda );

0voto

Thomas Levesque Punkte 277723

Verwenden Sie nicht .Compile würde es den Ausdruck in einen Delegaten umwandeln. Ein IQueryable wird über einen Ausdruck gefiltert, nicht über einen Delegaten:

_query = _query.Where(lambada);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X