requête dynamique utilisant un arbre d'expression

c# dynamic-linq expression-trees

Question

J'ai un formulaire dans lequel l'utilisateur choisira les éléments suivants dans les listes déroulantes:

  table_name
  columnName_to_sort_by
  columnName_to_search_in

L'utilisateur doit entrer Search_text dans une zone de texte

Le formulaire doit tirer des données de nombreuses tables. Je veux éviter d'écrire le tri et rechercher chaque champ pour chacune des tables. C'est pourquoi je veux utiliser des arbres d'expression. Je veux construire la requête dynamiquement.

Je souhaite écrire une méthode générique qui générera l’arbre des expressions pour les méthodes select , where et orderby , en fonction des entrées de l’utilisateur. Je peux utiliser System.Reflection pour obtenir le Type qui est interrogé (toutes mes tables sont des types - j'utilise LinqToSql).

Je ne sais pas comment former les arbres d'expression.

Voici ce que j'ai jusqu'à présent:

  table_name
  columnName_to_sort_by
  columnName_to_search_in

Comment puis-je implémenter la select , le sort et l' orderby utilisant dynamiquement des arbres d'expression?

Réponse populaire

Ce que vous avez est proche. Lorsque vous demandez "WHAT_SHOULD_BE_HERE", vous êtes curieux de savoir quelle expression utiliser pour indiquer le paramètre "source" de OrderBy, qui est généralement impliqué dans l'opérande utilisé comme méthode d'extension. Ce que vous devez faire, c'est modifier votre échantillon pour qu'il fonctionne avec IQueryable, et vous devez l'accepter comme paramètre d'entrée. Remplacez également votre espace réservé WHAT_SHOULD_BE_HERE par "list.Expression" comme indiqué ci-dessous.

private static IEnumerable<T> GetSortedData<T>(IQueryable<T> list, string sortColumnName) 
{ 
    var type = typeof(T); 
    var property = type.GetProperty(sortColumnName); 
    var parameter = Expression.Parameter(type, "p"); 
    var propertyAccess = Expression.Property(parameter, property); 
    var orderByExp = Expression.Lambda(propertyAccess, parameter); 
    MethodCallExpression resultExp = Expression.Call(typeof(Queryable), "OrderBy", new[] { type, property.PropertyType }, list.Expression, Expression.Quote(orderByExp)); 
    return (IEnumerable<T>)Expression.Lambda(resultExp).Compile().DynamicInvoke(); 
} 

J'ai testé cela avec le code suivant:

private static IEnumerable<T> GetSortedData<T>(IQueryable<T> list, string sortColumnName) 
{ 
    var type = typeof(T); 
    var property = type.GetProperty(sortColumnName); 
    var parameter = Expression.Parameter(type, "p"); 
    var propertyAccess = Expression.Property(parameter, property); 
    var orderByExp = Expression.Lambda(propertyAccess, parameter); 
    MethodCallExpression resultExp = Expression.Call(typeof(Queryable), "OrderBy", new[] { type, property.PropertyType }, list.Expression, Expression.Quote(orderByExp)); 
    return (IEnumerable<T>)Expression.Lambda(resultExp).Compile().DynamicInvoke(); 
} 

Quel imprimé:

private static IEnumerable<T> GetSortedData<T>(IQueryable<T> list, string sortColumnName) 
{ 
    var type = typeof(T); 
    var property = type.GetProperty(sortColumnName); 
    var parameter = Expression.Parameter(type, "p"); 
    var propertyAccess = Expression.Property(parameter, property); 
    var orderByExp = Expression.Lambda(propertyAccess, parameter); 
    MethodCallExpression resultExp = Expression.Call(typeof(Queryable), "OrderBy", new[] { type, property.PropertyType }, list.Expression, Expression.Quote(orderByExp)); 
    return (IEnumerable<T>)Expression.Lambda(resultExp).Compile().DynamicInvoke(); 
} 



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi