2009-11-08 16 views
5

हम कक्षाओंLinq संस्थाओं के लिए - EntityCollection नेविगेशन गुण में खोज

public Invoice: EntityObject 
{ 
    public EntityCollection<InvoicePosition> Positions { get {...}; set{...}; } 
    ... 
} 

public InvoicePosition: EntityObject 
{ 
    public string GroupName { get {...}; set{...}; } 
} 

हम IQueryable<Invoice> दिया जाता है, तो हम IQueryable<InvoicePosition> नहीं दिया जाता है। मुझे उन चालानों को कैसे ढूंढना चाहिए जिनके पास पद हैं, जहां ग्रुपनाम 'ईंधन' है?

IQueryable<Invoice> invoices = InvoiceRepository.List(); 
IQueryable<Invoice> invoicesThatHaveFuelPositions = 
    from i in invoices 
    where ? 
    select i 

EntityFramework इसे उचित एसक्यूएल क्वेरी में अनुवाद करने में सक्षम होना चाहिए।

संपादित

के रूप में मार्क सीनैन लिखा था, मैं उपयोग कर सकते हैं:

IQueryable<Invoice> invoices = InvoiceRepository.List().Include("Positions").Include("OtherInclude"); 
IQueryable<Invoice> invoicesThatHaveFuelPositions = 
    from i in invoices 
    from p in i.Positions 
    where p.GroupName = 'Fuel' 
    select i; 

एक समस्या है। जब मैं इस फ़िल्टरिंग का उपयोग करता हूं, तो मैं "अन्य शामिल" खो देता हूं। मुझे लगता है कि ईएफ का उपयोग करते समय फ़िल्टरिंग का यह उचित तरीका नहीं है। मुझे इसे बदलना होगा:

IQueryable<Invoice> invoices = InvoiceRepository.List().Include("Positions").Include("OtherInclude"); 
IQueryable<Invoice> invoicesThatHaveFuelPositions = invoices.Where(???); 

लेकिन मुझे कहां लिखना चाहिए?

संपादित

बदल दिया शामिल करें ("स्थिति") ("पदों") शामिल करने के लिए।

IQueryable<Invoice> invoicesThatHaveFuelPositions = 
    from i in invoices 
    where i.Positions.Any(p => p.GroupName == 'Fuel') 
    select i; 

यह काम करने के लिए लगता है और प्रभावित नहीं करता है एफई में शामिल हैं:

संपादित

एलेक्स जेम्स टिप (http://blogs.msdn.com/alexj/archive/2009/06/02/tip-22-how-to-make-include-really-include.aspx), जिससे पता चलता है के लिए लिंक दे दी है।

उत्तर

5

बिल्डिंग। आप ऐसा करते हैं:

var q = from i in invoices.Include("something") 
     from p in i.Positions 
     where p.GroupName == "Fuel" 
     select i; 

को शामिल खो दिया है (this tip देखें) क्योंकि एफई क्वेरी परिवर्तन के आकार, उदाहरण के लिए आप अंतर्निहित करते हैं से से एक SelectMany क्वेरी में की तरह मिलती है, उर्फ ​​अगर सब शामिल खो देता है ।

कामकाज आपकी क्वेरी लिखना है, और अंत में शामिल करें लागू करें।

कुछ इस तरह:

var q = ((from i in invoices 
     from p in i.Positions 
     where p.GroupName == "Fuel" 
     select i) as ObjectQuery<Invoice>).Include("something"); 

आप इस इकाई की रूपरेखा करते हैं वास्तव में शामिल होते हैं।

आशा इस

एलेक्स

+0

इस टिप के लिए धन्यवाद। अंत में शामिल करना समस्याग्रस्त है, क्योंकि मैं रिपोजिटरी पैटर्न का उपयोग करता हूं और इसमें पहले लागू होते हैं। मध्य समाधान (किसी भी() का उपयोग करके मुझे फिट बैठता है। – LukLed

2

कुछ इस तरह काम करना चाहिए:

var q = from i in invoices 
     from p in i.Positions 
     where p.GroupName == "Fuel" 
     select i; 

हालांकि, कि नेविगेशन संपत्ति Positions, जो डिफ़ॉल्ट रूप से लोड नहीं है (इकाई की रूपरेखा स्पष्ट लोड हो रहा है उपयोग करता है) का उपयोग करता है। यह हालांकि, वह काम है, invoices चर इस तरह बनाया गया था, तो: मार्क्स जवाब पर

var invoices = from i in myObjectContext.Invoices.Include("Positions") 
       select i; 
+0

यदि यह संकलित, हो सकता है कि यह काम करेगा मदद करता है :) – LukLed

+0

Invoice.Positions EntityCollection है। इसमें ग्रुपनाम संपत्ति नहीं है। इसमें चालान की सूची है। – LukLed

+0

क्षमा करें, मैंने प्रश्न में कोड को गलत तरीके से पढ़ा है। मैंने अभी जवाब अपडेट किया है। –

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