5

मैं पहली बार इकाई फ्रेमवर्क का उपयोग कर रहा हूं और देखा है कि संस्थाएं वस्तु इकाई संग्रह लौटाती हैं।आप ऑब्जेक्ट सेट से कैसे क्वेरी करते हैं और उसी क्वेरी में एक संलग्न इकाई संग्रह फ़िल्टर करते हैं?

DBEntities db = new DBEntities(); 
db.Users; //Users is an ObjectSet<User> 
User user = db.Users.Where(x => x.Username == "test").First(); //Is this getting executed in the SQL or in memory? 
user.Posts; //Posts is an EntityCollection<Post> 
Post post = user.Posts.Where(x => x.PostID == "123").First(); //Is this getting executed in the SQL or in memory? 

ऑब्जेक्टसेट और EntityCollection दोनों IQueryable लागू करें? मुझे उम्मीद है कि वे ऐसा करते हैं कि मुझे पता है कि डेटा स्रोत पर प्रश्नों को निष्पादित किया जा रहा है, स्मृति में नहीं।

संपादित करें: तो स्पष्ट रूप से EntityCollection ऑब्जेक्टसेट करता है जबकि नहीं। क्या इसका मतलब है कि मैं इस कोड का उपयोग करना बेहतर होगा?

DBEntities db = new DBEntities(); 
    User user = db.Users.Where(x => x.Username == "test").First(); //Is this getting executed in the SQL or in memory? 
    Post post = db.Posts.Where(x => (x.PostID == "123")&&(x.Username == user.Username)).First(); // Querying the object set instead of the entity collection. 

इसके अलावा, ऑब्जेक्टसेट और EntityCollection के बीच क्या अंतर है? क्या वे समान नहीं होना चाहिए?

अग्रिम धन्यवाद!

संपादित करें: क्षमा करें, मैं इसके लिए नया हूं। मैं समझने की कोशिश कर रहा हूँ। संलग्न इकाई चयन आलसी लोड होते हैं, इसलिए यदि मैं उन्हें एक्सेस करता हूं तो स्मृति उनके साथ आबादी होती है। बल्कि मेरा आखिरी संपादन में की तरह वस्तु सेट करने के लिए दो querys कर की तुलना में, मैं उत्सुक हूँ अगर इस क्वेरी अधिक के बाद मैं क्या था होगा:

DBEntities db = new DBEntities(); 
User user = (from x in db.Users 
      from y in x.Posts 
      where x.Username == "test" 
      where y.PostID == 123 
      select x).First(); 
+0

कोई भी जो इसका उत्तर देता है उसे यह करना होगा कि आपको यह प्रश्न पोस्ट करने के बजाय क्या करना चाहिए था। युक्ति, एफ 12 आपको संपत्ति की परिभाषा पर ले जाएगा जब कर्सर संपत्ति के नाम पर है और जब कर्सर प्रकार पर है। – Brian

+1

आपको एक स्मार्टस होने की जरूरत नहीं है। – Chev

उत्तर

3

ObjectSet<T>IQueryable<T> लागू करता है, लेकिन EntityCollection<T> नहीं करता है।

अंतर यह है कि ObjectSet<T> का उपयोग सीधे पूछताछ के लिए किया जाता है (यही कारण है कि यह इंटरफ़ेस को कार्यान्वित करता है)। दूसरी ओर, EntityCollection<T>, परिणाम सेट के "कई" अंत के लिए उपयोग किया जाता है, आमतौर पर ObjectSet<T> पर किए गए एक प्रश्न में लौटाया जाता है। इस प्रकार, यह IEnumerable<T> को लागू करता है, लेकिन IQueryable<T> नहीं है (क्योंकि यह पहले से ही एक क्वेरी के आबादी वाले परिणाम हैं)।

+0

तो फिर, जब मैं उपयोगकर्ता से पूछता हूं। पोस्ट्स मैं इन-मेमोरी संग्रह से पूछताछ कर रहा हूं? – Chev

+0

@ चेवेक्स: बिल्कुल। 'db.Users.here एक क्वेरी करता है, जो उपयोगकर्ता को देता है। चूंकि उपयोगकर्ता वापस आ गया है, इसलिए इसके सभी "पोस्ट" को पहले से ही खींच लिया गया है। –

+0

@ चेवेक्स: यदि आप इसे स्थानीय नहीं खींचना चाहते हैं तो आपको इन्हें एक ही क्वेरी में धक्का देना होगा। –

1

मैं लगभग हाँ कहने के लिए तैयार था, वे दोनों करते हैं। सौभाग्य से मैं पहले the documentation की जांच करता हूं।

EntityCollection IQueryable लागू नहीं करता है।

अंतर के लिए, ObjectSet<TEntity> डेटाबेस में किसी तालिका से उत्पन्न वस्तुओं का प्रतिनिधित्व करता है। EntityCollection<TEntity> एक से कई लोगों के 'कई' पक्ष पर कई वस्तुओं के लिए इकाई वस्तुओं के संग्रह का प्रतिनिधित्व करता है।

+0

मैं लगभग उसी सटीक चीज़ को लिख रहा था जब मुझे "नारंगी किसी और ने इस प्रश्न का उत्तर दिया" बार। ऐसा लगता है कि यह चाहिए, लेकिन मुझे नहीं लगता। – Jeff

+0

मैं सहमत हूं, ऐसा लगता है कि संस्था संग्रह को तुरंत लोड नहीं किया जाना चाहिए। क्या इसका मतलब हर बार उपयोगकर्ता ऑब्जेक्ट को पॉप्युलेट करता है, मुझे सभी पोस्ट भी मिलती हैं !!! ??? यह खराब है! इसका मतलब है कि एक उपयोगकर्ता क्वेरी उस उपयोगकर्ता की पोस्ट से पूछताछ कर रही है भले ही मैं उन तक पहुंचने का इरादा नहीं रखता। लंगड़ा। अब इकाई ढांचे पर पुनर्विचार करना। – Chev

संबंधित मुद्दे