Wie Operator in Expression Tree

.net entity-framework expression-trees lambda linq

Frage

Ich habe eine Linq-Erweiterungsmethode, um Linq-Abfragen mithilfe von Zeichenfolgenwerten dynamisch zu filtern. Zum Beispiel: query.WhereHelper("columName", ">", 1) . Ich könnte viele verschiedene Filteroperatoren wie GreaterThan oder NotEqual usw. verwenden, aber nicht "Gefällt mir". Es gibt kein Expression.Like oder Expression.StartsWith usw. Wie kann ich den Like-Operator in meinen Ausdrucksbaum implementieren? Hier ist mein Code:

public static IQueryable<T> WhereHelper<T>(this IQueryable<T> source, string columnName, object value, string filterType)
{
    ParameterExpression table = Expression.Parameter(typeof(T), "");
    Expression column = Expression.PropertyOrField(table, columnName);
    Expression valueExpression = Expression.Convert(Expression.Constant(value), column.Type);
    Expression where = null;

    switch (filterType)
    {
        case "<":
            where = Expression.LessThan(column, valueExpression);
            break;
        case "<=":
            where = Expression.LessThanOrEqual(column, valueExpression);
            break;
        case "=":
            where = Expression.Equal(column, valueExpression);
            break;
        case ">":
            where = Expression.GreaterThan(column, valueExpression;
            break;
        case ">=":
            where = Expression.GreaterThanOrEqual(column, valueExpression);
            break;
        case "<>":
            where = Expression.NotEqual(column, valueExpression);
            break;
    }

    Expression lambda = Expression.Lambda(where, new ParameterExpression[] { table });

    Type[] exprArgTypes = { source.ElementType };

    MethodCallExpression methodCall = Expression.Call(typeof(Queryable),
                                                      "Where",
                                                      exprArgTypes,
                                                      source.Expression,
                                                      lambda);

    return (IQueryable<T>)source.Provider.CreateQuery<T>(methodCall);

Akzeptierte Antwort

Sie würden Expression.Call mit den Methoden string.StartsWith , string.Contains , string.EndsWith usw. verwenden. Es ist für den konsumierenden Code, es zurück in TSQL zu übersetzen. Beachten Sie, dass es für LINQ-to-SQL hier auch einige zusätzliche Hilfsfunktionen gibt, aber nicht mit EF.


Beliebte Antwort

Sie können LIKE-Ausdruck wie folgt definieren:

var propertyName = "Firstname";
var propertyValue= "xxxx";

MethodInfo refmethod = typeof(string).GetMethod("Contains", new[] { typeof(string) });
var parameter = Expression.Parameter(typeof(T), "type");
var property = Expression.Property(parameter, propertyName);
var value = Expression.Constant(propertyValue, typeof(string));
var containsMethodExp = Expression.Call(property, refmethod, value);



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum