2009-01-24 5 views

Répondre

9

Utilisez ObjectContext#GetObjectByKey() pour récupérer les entités à l'aide de leur clé au lieu d'utiliser l'opérateur First() (ou FirstOrDefault) dans la requête LINQ. Ce dernier frappera la base de données à chaque fois tandis que le premier recherchera le cache EF (ObjectStateManager pour être spécifique) pour l'entité en premier et ne frappera pas la base de données si l'entité avec la clé spécifiée est trouvée.

Références

4

Supposons que nous avons entité BlogPost référence User entité via la propriété Author. Au lieu de spécifier une entité complète User à la propriété BlogPost.Author (ce qui peut nécessiter un échange de base de données), l'initialisation de la référence avec le EntityKey correct. Par exemple:

BlogPost.AuthorReference.EntityKey = new EntityKey("EFNamespace.User", "Id", userId); 
1

Un moyen rapide et facile de mettre à jour des objets d'entité détachés. C'est une méthode d'extension.

public static void AttachUpdated(this ObjectContext obj, EntityObject objectDetached) 
{ 
    if (objectDetached.EntityState == EntityState.Detached) 
    { 
     object original; 
     if (obj.TryGetObjectByKey(objectDetached.EntityKey, out original)) 
      obj.ApplyPropertyChanges(objectDetached.EntityKey.EntitySetName, objectDetached); 
     else 
      throw new ObjectNotFoundException(); 
    } 
} 
8

Une chose que je viens d'apprendre lors du profilage des requêtes SQL générées par le code EF utilisé dans mon application: il y a une différence entre:

IEnumerable<User> users = DB.User.Where(...); 
int count = users.Count(); 

et

IQueryable<User> users = DB.User.Where(...); 
int count = users.Count(); 

L'ancien génère une requête complète pour extraire les lignes correspondantes de la table User et le comptage est effectué après le transfert des données vers EF. Ce dernier fait ce qui est généralement attendu: générer un SQL SELECT COUNT ..., ce qui est beaucoup plus efficace. Ceci est assez subtil mais pas difficile à comprendre pourquoi après l'avoir remarqué: c'est dû à la nature statique de la méthode d'extension C#.

Une petite technique pour se déplacer est d'utiliser le mot-clé « var » pour déclarer la variable:

var users = DB.users.Where(...); 
int count = users.Count(); 

Cela entraînera des « utilisateurs » à déclarer que le même type que le rendement « Aux endroits où les » ; qui est un IQueryable <>.

+0

Ceci est un bon exemple de pourquoi nous devrions utiliser recommend 'var' sur un type de variable spécifique. – Rafid

Questions connexes