Wie erstelle ich einen Ausdrucksbaum, um das gleiche wie "StartsWith" zu machen

.net c# expression-trees lambda vb.net

Frage

Derzeit habe ich diese Methode, um zwei Zahlen zu vergleichen

Private Function ETForGreaterThan(ByVal query As IQueryable(Of T), ByVal propertyValue As Object, ByVal propertyInfo As PropertyInfo) As IQueryable(Of T)

    Dim e As ParameterExpression = Expression.Parameter(GetType(T), "e")
    Dim m As MemberExpression = Expression.MakeMemberAccess(e, propertyInfo)
    Dim c As ConstantExpression = Expression.Constant(propertyValue, propertyValue.GetType())
    Dim b As BinaryExpression = Expression.GreaterThan(m, c)
    Dim lambda As Expression(Of Func(Of T, Boolean)) = Expression.Lambda(Of Func(Of T, Boolean))(b, e)
    Return query.Where(lambda)

End Function

Es funktioniert gut und wird auf diese Weise konsumiert

Private Function ETForGreaterThan(ByVal query As IQueryable(Of T), ByVal propertyValue As Object, ByVal propertyInfo As PropertyInfo) As IQueryable(Of T)

    Dim e As ParameterExpression = Expression.Parameter(GetType(T), "e")
    Dim m As MemberExpression = Expression.MakeMemberAccess(e, propertyInfo)
    Dim c As ConstantExpression = Expression.Constant(propertyValue, propertyValue.GetType())
    Dim b As BinaryExpression = Expression.GreaterThan(m, c)
    Dim lambda As Expression(Of Func(Of T, Boolean)) = Expression.Lambda(Of Func(Of T, Boolean))(b, e)
    Return query.Where(lambda)

End Function

Wie Sie sehen können, gebe ich ihm eine IQueryable-Sammlung und fügt eine Where-Klausel hinzu, basierend auf einer Eigenschaft und einem Wert. Y kann Lessthan, LessOrEqualThan usw. Entsprechungen konstruieren, da System.Linq.Expressions.Expression diese Operatoren vordefiniert hat.

Wie kann ich diesen Code so umwandeln, dass er dasselbe mit Strings macht? System.Linq.Expressions.Expression gibt mir keinen vordefinierten Operator wie "contains" oder "startwith" und ich bin wirklich nicht mit Expression-Bäumen vertraut.

Danke, und bitte posten Sie Ihre Antwort in C # / VB. Wählen Sie diejenige, bei der Sie sich wohler fühlen.

Akzeptierte Antwort

using System;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;

namespace WindowsFormsApplication1
{
    static class Program
    {
        [STAThread]
        static void Main()
        {
            using (var context = new NorthwindEntities())
            {
                PropertyInfo propertyInfo = typeof(Customer).GetProperty("CustomerID"); 

                IQueryable<Customer> query = context.Customers;
                query = ETForStartsWith<Customer>(query, "A", propertyInfo); 
                var list = query.ToList();
            }
        }

        static IQueryable<T> ETForStartsWith<T>(IQueryable<T> query, string propertyValue, PropertyInfo propertyInfo)
        {
            ParameterExpression e = Expression.Parameter(typeof(T), "e");
            MemberExpression m = Expression.MakeMemberAccess(e, propertyInfo);
            ConstantExpression c = Expression.Constant(propertyValue, typeof(string));
            MethodInfo mi = typeof(string).GetMethod("StartsWith", new Type[] { typeof(string) });
            Expression call = Expression.Call(m, mi, c);

            Expression<Func<T, bool>> lambda = Expression.Lambda<Func<T, bool>>(call, e); 
            return query.Where(lambda);
        }
    }
}

Beliebte Antwort

Es ist kein Operator, sondern eine Methode, so dass Sie es mit Expression.Call () aufrufen können, wobei der Parameter methodinfo typeof (string) .GetMethod ("StartsWith") ist.




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