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

अगर मैं सभी विभिन्न भवनों है कि एक उपयोगकर्ता के हैं वापस जाने के लिए चाहता था, मैं क्या करना होगा निम्नलिखित:इकाई ढांचा: समग्र कुंजी के साथ एक तालिका से एक पंक्ति कैसे वापस करें?

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

मेरा प्रश्न क्या हुआ अगर मैं किसी विशिष्ट उपयोगकर्ता से एक विशिष्ट इमारत देखना चाहता है? ऐसा करने का सबसे अधिक 'कुशल' तरीका क्या होगा?

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

उत्तर

16

मुझे लगता है कि आप DbSet.Find विधि के लिए lookding रहे हैं: वहाँ एक बेहतर तरीका है (जैसे एक अंतर्निहित समारोह के रूप में) के बाद से है। यह विधि प्राथमिक कुंजी द्वारा इकाई पाती है। यदि आपके पास समग्र प्राथमिक कुंजी है, तो मॉडल में परिभाषित क्रम में महत्वपूर्ण मानों को पास करें:

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

एक आकर्षण की तरह काम करता है धन्यवाद! क्या आपको लगता है कि एल्गोरिदम की गति के संदर्भ में इसे "अधिक कुशल" माना जाएगा? – Deniz

+0

@Deniz डेटाबेस जांचने से पहले संदर्भ में पहले से मौजूद संदर्भ में पहली जांच पाएं, इसलिए हाँ, यह अधिक कुशल –

+2

@ डेनिज़: 'ढूँढें' वास्तव में बहुत धीमी हो सकती है यदि इकाई * लोड नहीं हुई है (http://stackoverflow.com/ प्रश्न/11686225/dbset खोज-विधि-हास्यास्पद-धीमी गति से करने के लिए singleordefault-ऑन-आईडी तुलना में)। अंगूठे का नियम, शायद: 'ढूंढें' का प्रयोग करें यदि यह संभव है कि ऑब्जेक्ट पहले ही संदर्भ में है। यदि आप जानते हैं कि यह अभी तक लोड नहीं हुआ है या यह बहुत ही असंभव है, तो अपने प्रश्न में क्वेरी का उपयोग करें। – Slauma