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

Gdybym chciał powrócić wszystkie inne budynki, które należą do użytkownika, chciałbym wykonać następujące czynności:Struktura obiektu: jak zwrócić wiersz z tabeli za pomocą kluczy złożonych?

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

Moje pytanie brzmi: co zrobić, jeśli chciałam wrócić konkretnego budynku od konkretnego użytkownika? Jaki byłby najbardziej "skuteczny" sposób robienia tego? Czy istnieje lepszy sposób (takie jak wbudowanej funkcji) niż:

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

Odpowiedz

16

Chyba jesteś lookding dla DbSet.Find metody. Ta metoda wyszukuje encje według klucza podstawowego. Jeśli masz złożony klucz podstawowy, podaj wartości klucza w kolejności zdefiniowanej w modelu:

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

działa jak wdzięk dziękuję! Czy uważasz, że byłoby to uznane za "bardziej efektywne" pod względem szybkości algorytmu? – Deniz

+0

@Deniz Znajdź najpierw sprawdza, czy jednostka jest już w kontekście przed wysłaniem zapytania do bazy danych, więc tak, jej bardziej wydajna –

+2

@Deniz: 'Znajdź' może być znacznie wolniejsze, jeśli jednostka jest * nie * załadowana (http://stackoverflow.com/ pytania/11686225/dbset-find-method-śmiesznie-powolny-porównywany-do-pojedynczego-potęgi-na-id). Być może z reguły: Użyj 'Znajdź', jeśli prawdopodobne jest, że obiekt jest już w kontekście. Jeśli wiesz, że nie jest jeszcze załadowany lub jest bardzo mało prawdopodobne, użyj zapytania w swoim pytaniu. – Slauma