2009-06-26 18 views
8

Sembra che GetObjectKey abbia il vantaggio di cercare oggetti esistenti e istanziati e POI l'archivio dati. Tuttavia, sembra che anche come si perde un po 'della tipizzazione forte, e la necessità di lanciare la vostra oggetto risultante:Recuperare entità Entity Framework utilizzando una query LINQ o GetObjectKey?

GetObjectKey

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

vs. LINQ

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

Personalmente, preferisco quest'ultima metodo, a causa della digitazione. Inoltre, il tuo DAL sarà abbastanza uniforme con tutti i metodi Get in fase di query, anche se questa è solo una preferenza personale.

Cosa usi ragazzi e ragazze?

+0

Nel primo metodo userei la parola chiave "as" invece del cast. In questo modo se il risultato è nullo non genererà un'eccezione. La parola chiave come tenta di eseguire il cast del valore ma se non è il tipo corretto, ti dà invece nullo. Quindi avresti context.GetObjectByKey (chiave) come Cliente ;. –

+0

Buon punto. Modificheremo l'esempio anche per il punteggio. –

risposta

9

Preferisco quest'ultimo perché è esplicitamente chiaro di cosa si desidera. Usando EntityKey (e questo è qualcosa che il team di ADO.NET sembra non capire), dobbiamo aggirare la struttura imposta da Entity Framework. Usando il linguaggio di query nel modo in cui hai fatto nel secondo esempio, stiamo dicendo a tutti gli altri sviluppatori che guarderanno mai il nostro codice, hey, vogliamo solo questo oggetto con questo ID o vogliamo null.

Non credo che essere corretto (come nel primo esempio) sia una scusa per non essere chiari ai colleghi. :)

1

Nella mia soluzione, utilizzo la programmazione generica. Nella classe Repository base ho un codice come questo:

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