IQueryable Extension: créer expression lambda pour l'interrogation d'une colonne pour un mot clé

J'ai commencé avec le IQueryable les méthodes d'extension à partir de cet exemple sur CodePlex.

Ce que je crois que j'ai besoin est un IQueryable méthode d'extension pour "Où", où la signature de la méthode ressemble:

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

et de l'efficacité (en supposant T. columnName est de type string):

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

à l'aide de la CodePlex exemple, je crois que je comprends comment il a obtenu le OrderBy méthode de travail, mais mon problème semble un peu plus complexe et je ne sais pas comment pour obtenir le Contient("mot clé") de la partie de travail.

Merci d'avance,

--Ed

Mise à jour: 9/13/2010 6:26pm PST

Je pensais que le suivant serait le travail, mais à la fin obtenir une NotSupportedException (L'expression LINQ nœud de type "Invoquer" n'est pas pris en charge dans LINQ to entities.) lorsque j'exécute l'expression via la fonction Count(). Des idées?

    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;
        }
    }
  • - vous jamais résoudre le "non pris en charge dans LINQ to entities" problème?
InformationsquelleAutor Ed Sinek | 2010-09-13