2011-12-19 16 views
6

मैं एक अच्छी सरल LINQ क्वेरी ढूंढ रहा हूं जो संग्रह के संग्रह में एक आइटम प्राप्त कर सकता है। निम्नलिखित मॉडल पर विचार करें ...LINQ: एक ऑब्जेक्ट के लिए संग्रह के भीतर संग्रह को खोजना

class Customer 
{ 
    List<Order> Orders; 
    int ID; 
} 

class Order 
{ 
    int ID; 
} 

चलें कहते हैं कि मैं प्रकार ग्राहक की एक सूची है ...

List<Customer> Customers; 

क्या मैं चाहता हूँ एक एकल आदेश की आईडी पर आधारित है ऑर्डर (यह मेरा ज्ञात इनपुट डेटा है)। मैं भी मान सकते हैं कि एक आदेश एक ग्राहक के लिए अद्वितीय है (इसलिए केवल आईडी मैं सभी ग्राहकों को भर रहा हूँ के साथ एक आदेश हो जाएगा)

वहाँ एक अच्छा LINQ क्वेरी मैं आदेश प्राप्त करने के लिए उपयोग कर सकते हैं है मैं खोज रहा हूँ?

मुझे पता है कि मैं ऑर्डर की एक सूची में आसानी से ऐसा कर सकता हूं, लेकिन यह सेट अप है जिसके साथ मुझे काम करना है। मैं अधिक डेटा के लिए पूछताछ नहीं करना चाहता, एफएफ मेरे पास पहले से ही मेमोरी में पर्याप्त है जो मुझे चाहिए।

मैं लूप के लिए सेमी-मैसी के साथ ऐसा कर सकता हूं। शायद मुझे यह करना चाहिए? शायद मैं कोड को बहुत सरल बनाने की कोशिश कर रहा हूं? ,

var matchingOrders = from customer in customers 
        from order in customer.Orders 
        where order.ID == orderID 
        select order; 

var order = matchingOrders.Single(); 

इस उत्तर के पिछले संस्करण में के रूप में ध्यान दें कि यदि ऐसी कोई मैचों या एक से अधिक कर रहे हैं कि इस असफल हो जायेगी:

उत्तर

13

ओह, प्रश्न पढ़ने में भूलना। आप SingleOrDefault, First, और FirstOrDefault पर भी देखना चाह सकते हैं।

इस कोड को भी SelectMany का उपयोग कर क्वेरी भाव के बिना लिखा जा सकता है:

var order = customers.SelectMany(customer => customer.Orders) 
        .Single(order => order.ID == orderID); 

ध्यान दें कि आप नहींWhere का उपयोग करने की आवश्यकता है और फिर Single - वहाँ के लिए एक Single अधिभार एक विधेय नहीं ले रहा है (और इसी तरह FirstOrDefault आदि)। चाहे आप क्वेरी अभिव्यक्ति फॉर्म का उपयोग करें या नहीं - I आमतौर परSelectMany की बजाय क्वेरी अभिव्यक्तियों का उपयोग करें, लेकिन इस मामले में आपको ग्राहक की आवश्यकता नहीं है, इसलिए आप SelectMany के सरल अधिभार का उपयोग कर सकते हैं।

+0

यह मेरे सवाल का जवाब नहीं है। मुझे ऑर्डर आइटम चाहिए ग्राहक नहीं। इतना बुरा है कि आप मेरे प्रश्न को सही तरीके से नहीं पढ़ रहे हैं, लेकिन 4 अप-मतदाता इसे भी नहीं पढ़ रहे हैं? अच्छा दिन नहीं – musefan

+0

@ संग्रहालय: ओह, मिस्रेड - अब एक नज़र डालें। –

+1

अच्छी वसूली;) 'SelectMany' जो मैं खोज रहा था, वह अस्तित्व में नहीं था। मुझे काम करने के लिए एक समेकित संग्रह देता है इसलिए मुझे यह पसंद है। क्वेरी अभिव्यक्तियों का प्रशंसक नहीं - मुझे कोड-वाई पर्याप्त नहीं लगता है – musefan

2

यहाँ 2 आदेश आईडी

var selectedOrder = customers.SelectMany(cc => cc.Orders.Where(cc1 => cc1.ID == 2)).FirstOrDefault(); 
संबंधित मुद्दे