2013-02-08 9 views
8
public class UserBuilding 
    { 
     [Key, Column(Order = 0)] 
     public int UserId { get; set; } 
     [Key, Column(Order = 1)] 
     public int BuildingId { get; set; } 
     public int BuildingLevel { get; set; } 
    } 

Se volevo tornare tutti i diversi edifici che appartengono a un utente, vorrei fare le seguenti operazioni:Framework Entity: come restituire una riga da una tabella con le chiavi composite?

database.UserBuildings.Where(b => b.UserId == userId); 

La mia domanda è che cosa se volevo restituire un edificio specifico da un utente specifico? Quale sarebbe il modo più "efficiente" per farlo? C'è un modo migliore (ad esempio una funzione built-in) al massimo i seguenti:

database.UserBuildings.Where(b => b.UserId == userId && b.BuildingId == buildingId); 

risposta

16

Penso che si sta lookding per DbSet.Find metodo. Questo metodo trova l'entità per chiave primaria. Se hai una chiave primaria composita, passa i valori chiave nell'ordine definito nel modello:

var userBuilding = database.UserBuildings.Find(userId, buildingId); 
+1

funziona come un incanto grazie! Pensi che questo sarebbe considerato "più efficiente" in termini di velocità dell'algoritmo? – Deniz

+0

@Deniz Trova i primi controlli se l'entità è già nel contesto prima di eseguire query sul database, quindi sì, è più efficiente –

+2

@Deniz: 'Trova' può essere molto più lento se l'entità è * non * caricata (http://stackoverflow.com/ domande/11686225/dbset-trovare-metodo-ridicolmente-slow-rispetto-al-SingleOrDefault-on-id). Regola empirica, forse: usa 'Trova' se è probabile che l'oggetto sia già nel contesto. Se sai che non è ancora caricato o è molto improbabile, usa la query nella tua domanda. – Slauma

Problemi correlati