2009-06-26 5 views
8

Il semble que GetObjectKey ait l'avantage de rechercher des objets instanciés existants, puis le magasin de données. Cependant, il semble aussi que vous perdez une partie de la forte frappe, et que vous devez jeter votre objet résultant:Récupérer des entités Entity Framework uniques en utilisant une requête LINQ ou GetObjectKey?

GetObjectKey

int customerID = 1; 
EntityKey key = new EntityKey("MyEntities.Customers", "CustomerID", customerID); 
Customer customer = context.GetObjectByKey(key) as Customer; 

contre LINQ

int customerID = 1; 
Customer customer = (from c in context.Customers 
        where c.CustomerID = customerID 
        select c).FirstOrDefault(); 

Personnellement, je préfère ce dernier méthode, à cause de la dactylographie. En outre, votre DAL sera assez uniforme avec toutes les requêtes Get étant des requêtes, bien que ce soit juste une préférence personnelle.

Qu'utilisez-vous, garçons et filles?

+0

Dans la première méthode, j'utiliserais le mot-clé "as" au lieu de la distribution. De cette façon, si le résultat est nul, il ne lancera pas d'exception. Le mot clé as tente de convertir la valeur mais si ce n'est pas le bon type, il vous donne null à la place. Donc, vous auriez context.GetObjectByKey (clé) en tant que client ;. –

+0

Bon point. Je vais modifier l'exemple pour égaliser un peu le score. –

Répondre

9

Je préfère ce dernier parce qu'il est clairement clair ce que vous voulez. En utilisant EntityKey (et c'est quelque chose que l'équipe ADO.NET ne semble pas comprendre), nous devons contourner la structure imposée par Entity Framework. En utilisant le langage de requête comme vous l'avez fait dans le second exemple, nous disons à tous les autres développeurs qui verront notre code, nous voulons juste que cet objet ait cet ID ou que nous voulions null.

Je ne pense pas que ce soit correct (comme vous l'êtes dans le premier exemple également) est une excuse pour ne pas être clair pour vos collègues. :)

1

Dans ma solution, j'utilise la programmation générique. Dans la classe Repository de base j'ai le code comme ceci:

private string GetEnittySetName(string entityTypeName) 
{ 
    var container = context.MetadataWorkspace.GetEntityContainer(context.DefaultContainerName, DataSpace.CSpace); 
    string entitySetName = (from meta in container.BaseEntitySets 
          where meta.ElementType.Name == entityTypeName 
          select meta.Name).FirstOrDefault(); 
    return entitySetName; 
} 

private string entitySetName; 

protected string EntitySetName 
{ 
    get 
    { 
     if (string.IsNullOrEmpty(entitySetName)) 
     { 
      entitySetName = GetEnittySetName(typeof(T).Name); 
     } 
     return entitySetName; 
    } 
} 

public T SelectOne(Func<T, bool> exp) 
{ 
    return context.CreateQuery<T>(EntitySetName).Where(exp).FirstOrDefault(); 
} 
Questions connexes