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

, ben yapardım aşağıdadır:Varlık çerçevesi: Kompozit anahtarlarla bir tablodan satır döndürme nasıl yapılır? Bir kullanıcıya ait tüm farklı binalar dönmek istiyorsa

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

Sorum Belirli bir kullanıcıya belirli bir binayı dönmek istiyorsa nedir? Bunu yapmanın en 'etkili' yolu ne olurdu?

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

cevap

16

Sana DbSet.Find yöntemi için lookding düşünüyorum: Aşağıdaki daha iyi bir yolu (örneğin yerleşik bir fonksiyonu olarak) var mı. Bu yöntem, varlığı birincil anahtara göre bulur. Birleşik birincil anahtarınız varsa, anahtar değerlerini modelde tanımladıkları sırayla geçirin:

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

Bir çekicilik gibi çalışır teşekkür ederim! Bunun, algoritmanın hızı açısından "daha verimli" kabul edileceğini düşünüyor musunuz? – Deniz

+0

@Deniz Veritabanını sorgulamadan önce bağlamda zaten var mı, bu nedenle evet, daha verimli –

+2

@ Deniz: Varlık, aslında * daha fazla olabilir * varlık * yüklü değil (http://stackoverflow.com/ sorular/11686225/dbset-bulmak-yöntem-gülünç-yavaş-to-singleordefault-on-id karşılaştırıldığında). Başparmak kuralı: Belki de nesnenin halihazırda bağlamda olması durumunda 'Bul 'öğesini kullanın. Henüz yüklenmediğini veya çok düşük olduğunu biliyorsanız, sorunuzdaki sorguyu kullanın. – Slauma

İlgili konular