पर विचार करें इन काल्पनिक इकाई वस्तुओं:निकाला जा रहा है का चयन एन 1 .Include बिना
public class Consumer
{
public int Id { get; set; }
public string Name { get; set; }
public bool NeedsProcessed { get; set; }
public virtual IList<Purchase> Purchases { get; set; } //virtual so EF can lazy-load
}
public class Purchase
{
public int Id { get; set; }
public decimal TotalCost { get; set; }
public int ConsumerId { get; set; }
}
अब मान लीजिए कि मैं इस कोड को चलाने के लिए चाहते हैं:
var consumers = Consumers.Where(consumer => consumer.NeedsProcessed);
//assume that ProcessConsumers accesses the Consumer.Purchases property
SomeExternalServiceICannotModify.ProcessConsumers(consumers);
डिफ़ॉल्ट रूप से यह एन चयन से भुगतना होगा + ProcessConsumers विधि के अंदर 1। जब यह उपभोक्ताओं विश्लेषण करता है यह एक प्रश्न ट्रिगर किया जाएगा तो यह 1. द्वारा प्रत्येक खरीद संग्रह 1 हड़पने देंगे इस समस्या का समाधान मानक जोड़ने के लिए एक में शामिल हो सकता है,:,
var consumers = Consumers.Include("Purchases").Where(consumer => consumer.NeedsProcessed);
//assume that ProcessConsumers accesses the Consumer.Purchases property
SomeExternalServiceICannotModify.ProcessConsumers(consumers);
कि कई मामलों में ठीक काम करता है लेकिन कुछ जटिल मामलों में, एक परिमाण परिमाण के आदेश द्वारा प्रदर्शन को पूरी तरह नष्ट कर सकता है। यह संभव है इस तरह कुछ करने के लिए है:।
- मेरी उपभोक्ताओं, वर उपभोक्ताओं पकड़ो = _entityContext.Consumers.Where (...) ToList()
- मेरी खरीदारी, वर खरीद = _entityContext.Purchases पकड़ो। कहां (...)। ToList()
- उपभोक्ता को हाइड्रेट करें। खरीदारी संग्रह मैन्युअल रूप से खरीदे गए खरीदारियों से खरीदता है। फिर जब मैं इसे प्रोसेस कंसुमर्स को पास करता हूं तो यह अधिक डीबी प्रश्नों को ट्रिगर नहीं करेगा।
मैं कैसे # 3 करने के लिए यकीन नहीं है। यदि आप किसी उपभोक्ता तक पहुंचने का प्रयास करते हैं। खरीद संग्रह जो आलसी लोड को ट्रिगर करेगा (और इस प्रकार एन + 1 का चयन करें)। शायद मुझे उपभोक्ताओं को उचित प्रकार (ईएफ प्रॉक्सी प्रकार के बजाय) में डालना होगा और फिर संग्रह लोड करना होगा? कुछ इस तरह:
foreach (var consumer in Consumers)
{
//since the EF proxy overrides the Purchases property, this doesn't really work, I'm trying to figure out what would
((Consumer)consumer).Purchases = purchases.Where(x => x.ConsumerId = consumer.ConsumerId).ToList();
}
संपादित करें: मैं है एक सा फिर से लिखा उदाहरण उम्मीद है कि और अधिक स्पष्ट रूप मुद्दा प्रकट करने के लिए।
आईआईआरसी ईएफ स्वचालित रूप से संग्रह को हाइड्रेट कर देगा, इसलिए # 3 मैन्युअल रूप से नहीं किया जाना चाहिए। – jeroenh
आपकी पहली क्वेरी को एक एकल SQL कथन के रूप में निष्पादित करना चाहिए। क्या आप कई डीबी कॉल देख रहे हैं? –
@ निकोलस, आप सही हैं, मैंने इसे एन + 1 का चयन करने के लिए उदाहरण अपडेट किया है। यह एक बहुत ही सरल संकुचित उदाहरण है, पूरे प्रश्न को पढ़ें और यह समझने की कोशिश करें कि मैं वास्तव में क्या पूछ रहा हूं। वास्तविक उदाहरण जहां शामिल हैं अपर्याप्त हैं नाटकीय रूप से अधिक जटिल हैं और एक SO प्रश्न के अंदर उचित नहीं है। – manu08