2013-02-08 14 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; } 
    } 

Wenn ich all die verschiedenen Gebäude zurückkehren wollte, die einem Benutzer gehören, würde ich Folgendes tun:Entity-Framework: Wie wird eine Zeile aus einer Tabelle mit zusammengesetzten Schlüsseln zurückgegeben?

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

Meine Frage ist, was passiert, wenn ich ein bestimmtes Gebäude von einem bestimmten Benutzer zurückkehren wollte? Was wäre der effizienteste Weg, dies zu tun? Gibt es eine bessere Art und Weise (wie eine eingebaute Funktion) als die folgende:

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

Antwort

16

Ich glaube, Sie für DbSet.Find Methode lookding. Diese Methode findet die Entität nach dem Primärschlüssel. Wenn Sie einen zusammengesetzten Primärschlüssel haben, übergeben Sie Schlüsselwerte in der Reihenfolge, in der sie im Modell definiert wurden:

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

funktioniert wie ein Charme, danke! Glauben Sie, dass dies in Bezug auf die Geschwindigkeit des Algorithmus als "effizienter" angesehen wird? – Deniz

+0

@Deniz Finden Sie zuerst überprüft, ob die Entität bereits im Kontext vor der Abfrage der Datenbank, also ja, seine effizientere –

+2

@Deniz: 'Find' kann tatsächlich viel langsamer sein, wenn die Entität * nicht * geladen ist (http://stackoverflow.com/ Fragen/11686225/dbset-find-method-lächerlich-langsam-im Vergleich zu einzelnen oder default-on-ID). Faustregel, vielleicht: Verwenden Sie 'Find', wenn es wahrscheinlich ist, dass das Objekt bereits im Kontext ist. Wenn Sie wissen, dass es noch nicht geladen ist oder es sehr unwahrscheinlich ist, verwenden Sie die Abfrage in Ihrer Frage. – Slauma

Verwandte Themen