Entity Framework Utiliser LINQ dynamiquement
Comment utiliser LINQ de manière dynamique?
LINQ vous permet d'écrire des requêtes de type sécurisé, et vous obtiendrez une vérification à la compilation de vos requêtes LINQ. Les requêtes de type sécurisé sont excellentes pour la plupart des scénarios, mais dans certains cas, vous aurez besoin de flexibilité pour construire des requêtes à la volée de manière dynamique.
Par exemple, nous avons un cas très simple où nous voulons trier les clients, mais nous ne savons pas comment nous voulons le commander jusqu'à ce que nous arrivions à l'exécution. C'est donc quelque chose sur lequel l'utilisateur clique ou qui entre comment il veut commander quelque chose. Il est impossible qu'un temps de compilation puisse formuler cela.
Questions relatives à StackOverflow
Réponse
Une façon de trier les clients est d’écrire de grosses instructions switch qui dépendent de l’entrée utilisateur et d’écrire une expression lambda différente pour chaque cas de l’instruction switch qui définirait ORDER BY et qui est difficile et devient difficile à gérer dans le fichier long terme aussi.
Bibliothèque de requêtes dynamiques
Traditionnellement, ces types de scénarios de requêtes dynamiques sont souvent gérés en concaténant des chaînes pour construire des requêtes SQL dynamiques. La bibliothèque de requêtes dynamiques fournie par l'équipe LINQ construit les requêtes LINQ de manière dynamique.
Il vous permet d’exprimer des requêtes LINQ à l’aide de méthodes d’extension qui utilisent des arguments de chaîne au lieu d’opérateurs de langage de type sûr.
using (var context = new EntityContext())
{
var customersList1 = context.Customers
.OrderBy("Name")
.ToList();
var customersList2 = context.Customers
.Include(x => x.Invoices)
.OrderBy("Invoices.Count descending")
.ToList();
}
Eval-Expression.NET
La bibliothèque Eval-Expression.NET vous permet d'évaluer, de compiler et d'exécuter du code C # ainsi qu'une expression au moment de l'exécution. La bibliothèque contient également une méthode d’extension pour LINQ dynamique.
using (var context = new EntityContext())
{
var customersList = context.Customers
.Where(c => "c.Invoices.Count > 2")
.ToList();
}
OrderByDynamic et OrderByDescendingDynamic
using (var context = new EntityContext())
{
var customersList1 = context.Customers
.OrderByDynamic(c => "c.Name")
.ToList();
var customersList2 = context.Customers
.Include(x => x.Invoices)
.Where(c => "c.Invoices.Count > 0")
.OrderByDescendingDynamic(c => "c.Invoices.Count")
.ToList();
}