2017-01-06 3 views
0


J'ai créé une fonction générique d'expression lambda comme ci-dessous.
J'essaie de créer une requête de filtre dynamique.
comment appliquer la méthode string.contains dans l'expression générique lambda

public Expression<Func<TSource, bool>> GenericExpression<TSource>(string propertyName, string searchTerm) 
    { 
     //x=>x.Name.Contains("Emre"); 
     var parameter = Expression.Parameter(typeof(TSource), "x"); 
     var property = Expression.Property(parameter,propertyName); 
     var search = Expression.Constant(searchTerm,typeof(string)); 
     MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) }); 
     var containsMethodExp = Expression.Call(property, method, search); 

     return Expression.Lambda<Func<TSource, bool>>(containsMethodExp, parameter); 
    } 

je reçois une erreur lorsque la fonction de GenericExpression d'appel. Le message d'erreur indique que:

Méthode 'Boolean Contient (System.String)' a déclaré le type 'System.String' ne peut pas être appelé par exemple de type 'System.Int32'

I ne comprends pas les détails de l'erreur.
Pourriez-vous s'il vous plaît expliquer
Merci

+1

Il semble que vous essayez d'appliquer cette expression de filtre sur une colonne numérique. –

+0

hımm oui juste. J'applique cette fonction dans une boucle foreach et le premier type d'argument est numérique. Les autres sont des chaînes. n'est pas possible de convertir un type numérique en chaîne dans ce cas. je vous remercie – mrkiyak

+0

Donc, je dois d'abord appliquer la méthode ToString – mrkiyak

Répondre

0

Erreur fixe. Nous devrions vérifier le type d'argument avant d'appeler la méthode via PropertyInfo.PropertyType. Ça fonctionne maintenant.

public IQueryable<T> Search<T>(DbSet<T> dbSet, string searchTerm, IGridItem gridItemType) where T : class 
    { 
     var query = new SearchQuery<T>().Query; 
     query = dbSet; 
     var gridItemFields = gridItemType.GetType().GetProperties(); 

     foreach (var field in gridItemFields) 
     { 
      if (field.PropertyType == typeof(String)) 
      { 
       string _nameProperty = typeof(T).GetProperty(field.Name).Name; 
       var lambda = GenericExpression<T>(_nameProperty, searchTerm); 
       query = query.Where(lambda); 
      } 
     } 

     return query; 
    } 

public Expression<Func<TSource, bool>> GenericExpression<TSource>(string propertyName, string searchTerm) 
    { 
     //x=>x.Name.Contains("Emre"); 
     ParameterExpression parameter = Expression.Parameter(typeof(TSource), "x"); 
     Expression property = Expression.Property(parameter,propertyName); 
     var search = Expression.Constant(searchTerm,typeof(string)); 

     MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) }); 
     var containsMethodExp = Expression.Call(property, method, search); 

     return Expression.Lambda<Func<TSource, bool>>(containsMethodExp, parameter); 
    }