IQueryable-Erweiterung: erstellen lambda-Ausdruck für die Abfrage eine Spalte nach einem Schlüsselwort

Begann ich mit dem IQueryable Erweiterung Methoden aus diesem Beispiel auf CodePlex.

Was ich glaube, was ich brauche, ist ein IQueryable-extension Methode "Where", wo die Signatur der Methode sieht wie folgt aus:

public static IQueryable<T> Where<T>(this IQueryable<T> source, string columnName, string keyword)

effektiv und tut dies (vorausgesetzt, T. Spaltenname vom Typ string):

source.Where(p => p.ColumnName.Contains("keyword"))

mithilfe der oben genannten CodePlex Beispiel, ich glaube, ich verstehe, wie er die OrderBy-Methode arbeiten, aber mein problem scheint etwas komplexer und ich weiß nicht, wie man die Contains("keyword") Teil der Arbeit.

Vielen Dank im Voraus,

--Ed

Update: 9/13/2010 6:26pm PST

Ich dachte, die folgenden funktionieren würde, aber am Ende immer eine NotSupportedException (Die LINQ-Ausdruck ein node-type 'Invoke' wird nicht unterstützt LINQ to Entities.) wenn ich ausführen, die den Ausdruck über Count(). Irgendwelche Ideen?

    public static IQueryable<T> Where<T>(this IQueryable<T> source, string columnName, string keyword)
    {
        var type = typeof(T);
        var property = type.GetProperty(columnName);
        if (property.PropertyType == typeof(string))
        {
            var parameter = Expression.Parameter(type, "p");
            var propertyAccess = Expression.MakeMemberAccess(parameter, property);
            var sel = Expression.Lambda<Func<T, string>>(propertyAccess, parameter);
            var compiledSel = sel.Compile();
            return source.Where(item => compiledSel(item).Contains(keyword));
        }
        else
        {
            return source;
        }
    }
Sie jemals lösen "nicht unterstützt LINQ to Entities" problem?

InformationsquelleAutor Ed Sinek | 2010-09-13

Schreibe einen Kommentar