2009-06-26 1 views
8

Es sieht so aus, als ob GetObjectKey den Vorteil hat, nach vorhandenen, instanziierten Objekten und DANN nach dem Datenspeicher zu suchen. Aber es scheint auch, wie Sie einige der starke Typisierung verlieren, und benötigen eine resultierende Objekt zu werfen:Abrufen einzelner Entity Framework-Entitäten mithilfe einer LINQ-Abfrage oder GetObjectKey?

GetObjectKey

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

gegen LINQ

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

Ich persönlich ziehe letzteres Methode, wegen der Typisierung. Außerdem wird Ihre DAL ziemlich einheitlich sein, da alle Get-Methoden Abfragen sind, obwohl das nur eine persönliche Präferenz ist.

Was benutzen Sie Jungen und Mädchen?

+0

In der früheren Methode würde ich das "as" Schlüsselwort anstelle der Besetzung verwenden. Wenn das Ergebnis null ist, wird keine Ausnahme ausgelöst. Das as-Schlüsselwort versucht, den Wert zu übergeben, aber wenn es nicht der richtige Typ ist, gibt es stattdessen null. Sie hätten also context.GetObjectByKey (key) als Customer ;. –

+0

Guter Punkt. Ich werde das Beispiel modifizieren, um die Punktzahl ein wenig zu verbessern. –

Antwort

9

Ich bevorzuge letztere, weil es explizit klar ist, was Sie wollen. Durch die Verwendung von EntityKey (und das scheint das ADO.NET-Team nicht zu verstehen) müssen wir die von Entity Framework auferlegte Struktur umgehen. Indem wir die Abfragesprache so verwenden, wie Sie es im zweiten Beispiel getan haben, sagen wir allen anderen Entwicklern, die sich jemals unseren Code ansehen werden, hey, wir wollen nur dieses Objekt mit dieser ID oder wir wollen null.

Ich glaube nicht, dass das Korrektsein (wie im ersten Beispiel) eine Entschuldigung dafür ist, Ihren Kollegen nicht klar zu sein. :)

1

In meiner Lösung verwende ich generische Programmierung. In der Basis-Repository-Klasse habe ich Code wie folgt:

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(); 
}