Upload
charles-joseph
View
105
Download
0
Embed Size (px)
Citation preview
Développement d’application avec base de donnéesSemaine 2: Requête avec l’Entity Data Model
Automne 2013
Méthodes pour faire des requêtes Premier exemple de requêtes…mais plus de
questions que de réponses…
Plan de présentation
Plusieurs méthodes disponibles pour faire des requêtes. Le choix va reposer sur un choix personnelle plus que sur une question de performance.
Méthodes utilisées Linq To Entities ObjectQuery Parcourir une collection Etc.
Méthodes pour faire des requêtes
Query the Model, Not the Database Laissons ce travail à ADO.NET et son provider.
Méthodes pour faire des requêtes
Première requête -> Parcourir une collection
En fait! Var contacts = context.Contacts; c’est
ObjectSet<Contact> contacts = context.Contacts;
Type
Les classes suivantes sont générés automatiquement.
Mais d’où viennent ces classes
Les propriétés de navigation nous permettent d’interroger les entités associés.
Les propriétés de navigation
Linqvar contacts = from c in context.Contactswhere c.FirstName == "Robert"select c; lambda :var contacts = context.Contacts.Where((c) => c.FirstName == "Robert").OrderBy((foo) => foo.LastName);
Qui dit collection dit Linq/Lambda
Pourquoi le la clause FROM est au début contrairement au SQL?
Question de culture!
Ici, les propriétés de navigation nous simplifie vraiment la vie:
from a in context.Addresseswhere a.Contact.AddDate > new System.DateTime(2009, 1, 1)orderby a.Contact.LastNameselect new {a, a.Contact.LastName};
Propriété de navigation avec Linq
Entity Framework’s Object Services qStr = "SELECT VALUE c FROM SampleEntities.Contacts AS c " + "WHERE c.firstname=@firstName";ObjectQuery<Contact> contacts = new ObjectQuery<Contact>(qStr, context);contacts.Parameters.Add(new ObjectParameter("firstName", "Robert"));
Une autre façon de faire une requête
Lorsqu’on fait une requête, seuls les éléments de la requête serons affectés au résultat de la requête.
Par exemple:var contacts= from c in context.Contacts select c; Seul les contacts sont chargés à partir de la
base de données, les données en liens ne sont pas chargé. Autrement la base de données serait toujours téléchargée…
lazy loading
Le Lazyloading fait donc des requêtes constamment pour permettre au programeur d’avoir accès aux données.
Exemple:var contacts= from c in context.Contacts select c;foreach (var contact in contacts){ Console.WriteLine("{0} #Addresses: {1}", contact.LastName,contact.Addresses.Count());}Ainsi, s’il y a 10 contacts, il y aura 11 requêtes de réalisées.
Lazy Loading
Soit qu’on fait une requête complète.from c in context.Contacts.Include("Addresses")where c.LastName.StartsWith("J")select c;
Soit qu’on désactive le lazy loading essayer de filtrer les données qui seront chargées.
Solution?
var context = new SampleEntities();context.ContextOptions.LazyLoadingEnabled = false;var addresses = from a in context.Addresses select a ;foreach (var address in addresses){
if (address.CountryRegion != null){
if (address.CountryRegion.Trim() == "UK"){address.ContactReference.Load();}
}
}
Si on désactive le Lazy Loading
Nous avons vue trois différentes façon de faire une requête sur le MODÈLE.
Nous avons vue le Lazy Loading. Maintenant, à votre tour de jouer.
Conclusion