2008-11-25 13 views
40

पर कॉल करने के बजाय, सीधे बाल ऑब्जेक्ट्स लोड करने के लिए आप LINQ से Entities क्वेरी का निर्माण कैसे करते हैं, मैं LINQ से Entities (या एंटीटी फ्रेमवर्क जो भी इसे कॉल कर रहा हूं) का उपयोग करने के लिए नया हूं और मैं 'इस तरह कोड का एक बहुत कुछ लिख हूँ:संदर्भ संपत्ति या लोड()

var item = (from InventoryItem item in db.Inventory 
      where item.ID == id 
      select item).First<InventoryItem>(); 

और उसके बाद इस तरह उस वस्तु पर तरीकों बुला:

var type = item.ItemTypeReference; 

या

var orders = item.OrderLineItems.Load(); 
बच्चे या संबंधित वस्तुओं को पुनर्प्राप्त करने के लिए

मैंने डीबी का प्रोफाइल नहीं किया है या बहुत गहराई से खोला है लेकिन मेरा अनुमान यह है कि जब मैं एक कॉल करता हूं। लोड() या * संदर्भ संपत्ति मैं वास्तव में डीबी को एक और कॉल कर रहा हूं। यदि ऐसा है, तो क्या उन वस्तुओं को मेरी प्रारंभिक LINQ अभिव्यक्ति में प्राप्त करने का कोई तरीका है?

उत्तर

58

आप इस "Shaping query results" आलेख में शामिल (स्ट्रिंग) विधि संदर्भों का उपयोग करना चाहते हैं।

var item = from InventoryItem item in 
       db.Inventory.Include("ItemTypeReference").Include("OrderLineItems") 
      where item.ID == id 
      select item; 

शायद इसमें शामिल होने के लिए "एसक्यूएल" शैली वाक्यविन्यास भी है।

LINQ-to-SQL से LINQ-to-Entities तक जाने के बारे में यह article भी देखें।

एसक्यूएल को Linq के लिए इस समस्या का समाधान आप (जो के लिए आपके पास विकल्प DataContext और अन्य प्रकार) निम्न कार्य करने के लिए देख रहे हैं दूसरों के लिए:

using (DataContext db = new DataContext()) 
{ 
    DataLoadOptions options = new DataLoadOptions(); 
    options.LoadWith<InventoryItem>(ii => ii.ItemTypeReference); 
    options.LoadWith<InventoryItem>(ii => ii.OrderLineItems); 
    db.LoadOptions = options; 

    var item = from InventoryItem item in db.Inventory 
       where item.ID == id 
       select item; 
} 

यह गुण निर्दिष्ट लोड होगा लोडविथ में जब भी मूल आइटम (इन्वेंटरीइटम) ​​लोड होता है, उस विशेष संदर्भ के लिए।

जेम्स और जेस्पर से कुछ आगे के प्रश्न के जवाब में, इस question

+0

क्यों के लिए मुझे db "क्वेरी परिणामों को आकार" @mohsen जवाब के दूसरे भाग एसक्यूएल, एक अब परित्यक्त ढांचे लिंक के लिए – mohsen

+1

नहीं है –

+0

धन्यवाद करने के लिए LINQ के लिए है LoadOptions संपत्ति? (EF5) – ehsan88

0

की जाँच रॉबर्ट के जवाब देने के लिए इसके अलावा, आप है कि आप .Include लिए अनुमति देता है एक विस्तार विधि के लिए विकल्प के लिए इस सवाल का बाहर की जाँच करने के लिए पसंद कर सकते हैं(), एक स्ट्रिंग के बजाय एक अभिव्यक्ति का उपयोग कर ताकि आप समय की जाँच संकलन मिलती है:

Entity Framework .Include() with compile time checking?

0

AFAIK, Silverlight (डोमेन सेवा) को जोड़ने के लिए [शामिल करें] सही जगह पर विशेषता (मेटाडाटा में नेविगेशन संपत्ति पर) एनओओ है ओह https://stackoverflow.com/a/5332188/413032

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