Entity Framework - Requêtes de projection

LINQ vers les entités

L'un des concepts les plus importants pour comprendre LINQ to Entities est qu'il s'agit d'un langage déclaratif. L'accent est mis sur la définition des informations dont vous avez besoin, plutôt que sur la façon d'obtenir les informations.

  • Cela signifie que vous pouvez passer plus de temps à travailler avec des données et moins de temps à essayer de comprendre le code sous-jacent requis pour effectuer des tâches telles que l'accès à la base de données.

  • Il est important de comprendre que les langages déclaratifs ne suppriment aucun contrôle du développeur, mais cela aide le développeur à concentrer son attention sur ce qui est important.

Mots-clés essentiels LINQ to Entities

Il est important de connaître les mots-clés de base utilisés pour créer une requête LINQ. Il n'y a que quelques mots clés à retenir, mais vous pouvez les combiner de différentes manières pour obtenir des résultats spécifiques. La liste suivante contient ces mots-clés de base et fournit une description simple de chacun d'eux.

Sr. No. Mot-clé et description
1

Ascending

Spécifie qu'une opération de tri a lieu du plus petit (ou le plus bas) élément d'une plage à l'élément le plus élevé d'une plage. Il s'agit normalement du paramètre par défaut. Par exemple, lors d'un tri alphabétique, le tri serait compris entre A et Z.

2

By

Spécifie le champ ou l'expression utilisé pour implémenter un regroupement. Le champ ou l'expression définit une clé utilisée pour effectuer la tâche de regroupement.

3

Descending

Spécifie qu'une opération de tri a lieu du plus grand (ou le plus élevé) élément d'une plage à l'élément le plus bas d'une plage. Par exemple, lors d'un tri alphabétique, le tri serait compris entre Z et A.

4

Equals

Utilisé entre les clauses gauche et droite d'une instruction de jointure pour joindre la source de données contextuelles principale à la source de données contextuelles secondaire. Le champ ou l'expression à gauche du mot clé equals spécifie la source de données principale, tandis que le champ ou l'expression à droite du mot clé equals spécifie la source de données secondaire.

5

From

Spécifie la source de données utilisée pour obtenir les informations requises et définit une variable de plage. Cette variable a le même but qu'une variable utilisée pour l'itération dans une boucle.

6

Group

Organise la sortie en groupes à l'aide de la valeur de clé que vous spécifiez. Utilisez plusieurs clauses de groupe pour créer plusieurs niveaux d'organisation de sortie. L'ordre des clauses de groupe détermine la profondeur à laquelle une valeur de clé particulière apparaît dans l'ordre de regroupement. Vous combinez ce mot-clé avec par pour créer un contexte spécifique.

sept

In

Utilisé de plusieurs manières. Dans ce cas, le mot-clé détermine la source de base de données contextuelle utilisée pour une requête. Lorsque vous travaillez avec une jointure, le mot clé in est utilisé pour chaque source de base de données contextuelle utilisée pour la jointure.

8

Into

Spécifie un identificateur que vous pouvez utiliser comme référence pour les clauses de requête LINQ telles que join, group et select.

9

Join

Crée une seule source de données à partir de deux sources de données associées, comme dans une configuration maître / détail. Une jointure peut spécifier une jointure interne, de groupe ou externe gauche, avec la jointure interne par défaut. Vous pouvez en savoir plus sur les jointures sur msdn.microsoft.com

dix

Let

Définit une variable de plage que vous pouvez utiliser pour stocker les résultats de sous-expression dans une expression de requête. En règle générale, la variable de plage est utilisée pour fournir une sortie énumérée supplémentaire ou pour augmenter l'efficacité d'une requête (de sorte qu'une tâche particulière, telle que la recherche de la valeur minuscule d'une chaîne, ne doive pas être effectuée plus d'une fois).

11

On

Spécifie le champ ou l'expression utilisé pour implémenter une jointure. Le champ ou l'expression définit un élément commun aux deux sources de données contextuelles.

12

Orderby

Crée un ordre de tri pour la requête. Vous pouvez ajouter le mot-clé croissant ou décroissant pour contrôler l'ordre du tri. Utilisez plusieurs clauses orderby pour créer plusieurs niveaux de tri. L'ordre des clauses orderby détermine l'ordre dans lequel les expressions de tri sont gérées, donc l'utilisation d'un ordre différent entraînera une sortie différente.

13

Where

Définit ce que LINQ doit extraire de la source de données. Vous utilisez une ou plusieurs expressions booléennes pour définir les spécificités des éléments à récupérer. Les expressions booléennes sont séparées les unes des autres à l'aide des symboles && (AND) et || (OR) opérateurs.

14

Select

Détermine la sortie de la requête LINQ en spécifiant les informations à renvoyer. Cette instruction définit le type de données des éléments renvoyés par LINQ pendant le processus d'itération.

Projection

Les requêtes de projection améliorent l'efficacité de votre application, en ne récupérant que des champs spécifiques de votre base de données.

  • Une fois que vous avez les données, vous pouvez les projeter ou les filtrer selon les besoins pour façonner les données avant la sortie.

  • La tâche principale de toute expression LINQ to Entities est d'obtenir des données et de les fournir en sortie.

La section «Développement de requêtes LINQ to Entities» de ce chapitre présente les techniques permettant d'effectuer cette tâche de base.

Jetons un coup d'œil au code suivant dans lequel la liste des étudiants sera récupérée.

using (var context = new UniContextEntities()) {

   var studentList = from s in context.Students select s;

   foreach (var student in studentList) {
      string name = student.FirstMidName + " " + student.LastName;
      Console.WriteLine("ID : {0}, Name: {1}", student.ID, name);
   }
}

Objet unique

Pour récupérer un seul objet étudiant, vous pouvez utiliser les méthodes énumérables First () ou FirstOrDefault qui retournent le premier élément d'une séquence. La différence entre First et FirstOrDefault est que First () lèvera une exception s'il n'y a pas de données de résultat pour les critères fournis alors que FirstOrDefault () renvoie la valeur par défaut null, s'il n'y a pas de données de résultat. Dans l'extrait de code ci-dessous, le premier étudiant de la liste sera récupéré dont le prénom est Ali.

using (var context = new UniContextEntities()) {

   var student = (from s in context.Students where s.FirstMidName 
      == "Ali" select s).FirstOrDefault<Student>();

   string name = student.FirstMidName + " " + student.LastName;
   Console.WriteLine("ID : {0}, Name: {1}", student.ID, name);
}

Vous pouvez également utiliser Single () ou SingleOrDefault pour obtenir un seul objet étudiant qui renvoie un seul élément spécifique d'une séquence. Dans l'exemple suivant, un seul étudiant est récupéré dont l'ID est 2.

using (var context = new UniContextEntities()) {

   var student = (from s in context.Students where s.ID 
      == 2 select s).SingleOrDefault<Student>();
   string name = student.FirstMidName + " " + student.LastName;
	
   Console.WriteLine("ID : {0}, Name: {1}", student.ID, name);
   Console.ReadKey();
}

Liste des objets

Si vous souhaitez récupérer la liste des étudiants dont le prénom est Ali, vous pouvez utiliser la méthode énumérable ToList ().

using (var context = new UniContextEntities()) {

   var studentList = (from s in context.Students where s.FirstMidName 
      == "Ali" select s).ToList();

   foreach (var student in studentList) {
      string name = student.FirstMidName + " " + student.LastName;
      Console.WriteLine("ID : {0}, Name: {1}", student.ID, name);
   }

   Console.ReadKey();
}

Ordre

Pour récupérer des données / liste dans un ordre particulier, vous pouvez utiliser le mot-clé orderby. Dans le code suivant, la liste d'extraits de l'élève sera récupérée par ordre croissant.

using (var context = new UniContextEntities()) {

   var studentList = (from s in context.Students orderby
      s.FirstMidName ascending select s).ToList();

   foreach (var student in studentList) {
      string name = student.FirstMidName + " " + student.LastName;
      Console.WriteLine("ID : {0}, Name: {1}", student.ID, name);
   }

   Console.ReadKey();
}

Requête Standard Vs Projection Entity Framework

Supposons que vous ayez un modèle Student contenant l'ID, FirstMidName, LastName et EnrollmentDate. Si vous souhaitez renvoyer une liste d'étudiants, une requête standard renverra tous les champs. Mais si vous souhaitez uniquement obtenir une liste d'étudiants contenant les champs ID, FirstMidName et LastName. C'est là que vous devez utiliser une requête de projection. Voici un exemple simple de requête de projection.

using (var context = new UniContextEntities()) {

   var studentList = from s in context.Students
      orderby s.FirstMidName ascending
      where s.FirstMidName == "Ali"

   select new {s.ID, s.FirstMidName, s.LastName};

   foreach (var student in studentList) {
      string name = student.FirstMidName + " " + student.LastName;
      Console.WriteLine("ID : {0}, Name: {1}", student.ID, name);
   }

   Console.ReadKey();
}

La requête de projection ci-dessus exclut le champ EnrollmentDate. Cela rendra votre demande beaucoup plus rapide.