2011-06-16 21 views
6

के विषय में प्रश्न मान लें मैं AdventureWorks डीबी के खिलाफ निम्न क्वेरी है:Linq - 'कोई भी' विधि

var result = from customer in Customer 
    where customer.CustomerAddress.Any (ca => ca.Address.City == "Dallas") 
    select new 
    { 
     customer.Individual.Contact.FirstName, 
     Addresses = customer.CustomerAddress 
    }; 

इस क्वेरी सभी ग्राहकों को जो डलास में रहते हैं वापस आ जाएगी। हालांकि, मुझे यकीन नहीं है कि यह क्यों काम करता है। मुझे पता है कि 'कोई भी' विधि एक बूलियन लौटाती है कि इस अनुक्रम में पंक्तियों में से कोई भी भविष्य को संतुष्ट करता है या नहीं। लेकिन इस तरह से प्रयोग किया जाता है, ऐसा प्रतीत होता है कि यह वास्तव में उन पंक्तियों का अनुक्रम लौटा रहा है जो भविष्यवाणी को पूरा करते हैं। मुझे लगता है मुझे यकीन नहीं है कि यहां क्या हो रहा है।

हालांकि, का प्रयोग इस प्रकार, यह आसान समझने के लिए 'कोई भी' काम कर रहा है है:

var result = Customer.Any (c => c.CustomerAddress.Any (ca => ca.Address.City == "Largo")); 

इस झूठे रिटर्न क्योंकि कोई ग्राहकों लार्गो में रहते हैं।

+0

क्या बात आपको समझ में नहीं आ रही है? क्या यह पहली बार पंक्तियों को लौटने वाला पहला उदाहरण है और दूसरा बूलियन है? – archil

+0

@archil - हाँ, बिल्कुल। –

उत्तर

11

पहली क्वेरी सभी ग्राहकों को जो डलास में किसी भी पते हैं के रूप में

वापसी पढ़ा जा सकता है।

क्वेरी में प्रतिक्रिया या परिणाम "यहां वे ग्राहक हैं।" पहली क्वेरी, Any पते के खिलाफ सख्ती से है। ऐसे ग्राहकों जिनके पास पते हैं जो Any को संतुष्ट करते हैं।

के रूप में दूसरा क्वेरी मैं किसी भी ग्राहकों को जो लार्गो में किसी भी पते हैं है?

परिणाम या तो हाँ या नहीं (सत्य या गलत) है। आपने Any से दोनों पते और और पते पर Any के परिणाम लागू किए हैं। तो क्वेरी का पहला भाग "लार्गो में पते वाले ग्राहकों द्वारा फ़िल्टर किया गया है" और दूसरा "अब मैं जानना चाहता हूं कि मेरे पास ऐसे कोई ग्राहक हैं।"

क्या यह अब समझ में आता है?

1

आप पंक्तियों क्योंकि आप एक है, जहां एक select बयान के खंड है, जो पंक्तियों की एक सूची का चयन करेंगे के रूप में Any विधि का उपयोग कर रहे हैं विधेय को संतुष्ट करना की एक सूची हो रही है।

तो आपका पहला उदाहरण कहता है 'उन सभी ग्राहकों का चयन करें जिनके पास पता है जहां पता' शहर डलास के बराबर है। Any पंक्तियों की एक सूची नहीं लौटा रहा है (यह केवल खंड के लिए एक शर्त के रूप में कार्य कर रहा है), select कथन है।

1

ग्राहक में प्रत्येक तत्व (प्रत्येक ग्राहक के बारे में हां या नहीं) के लिए कहां निकाला जाता है। तो आप उन सभी ग्राहकों को प्राप्त कर रहे हैं जिनके पास कोई पता शहर = डलास है।

दूसरा स्टेटमेंट विशेष रूप से कहता है कि क्या किसी ग्राहक के पास पता शहर = लार्गो है।(हाँ या नहीं)

1
    प्रत्येक customer लिए Customer
  • जब customer की CustomerAddresses का संग्रह एक City क्षेत्र से मेल खाता है "Dallas"
  • का चयन करें "पहला नाम और पतों की संग्रह के साथ कम से कम एक Address है में
  • ग्राहक का "।
1

Here're अपने उदाहरण विधि वाक्य रचना में फिर से लिखा के दोनों (पहले एक अपने उदाहरण में मिश्रित वाक्य रचना में है, दूसरा पहले से ही विधि में है)

IEnumerable result = Customers 
    .Where(c => c.CustomerAddress.Any(ca => ca.Address.City == "Dallas")) 
    .Select(c=> new { FirstName = c.Individual.Contact.FirstName, Addresses = c.Addresses}; 

    //vs 

    bool result = Customers.Any (c => c.CustomerAddress.Any (ca => ca.Address.City == "Dallas")); 

कार्य देखते हैं? पहला कथन समाप्त => वापसी के साथ समाप्त होता है। किसी भी => रिटर्न बूल

4

Any एक बूल देता है, लेकिन इसे where खंड में खिलाया जा रहा है। where खंड एक बूलियन अभिव्यक्ति लेता है, इसे अनुक्रम में प्रत्येक आइटम पर लागू करता है, और उन वस्तुओं को लौटाता है जहां अभिव्यक्ति सत्य है। विस्तार विधि वाक्य रचना में तो, आपकी जिज्ञासा का अनुवाद करने के लिए:

var result = Customer 
      .Where(customer => customer.CustomerAddress.Any(ca => ca.Address.City == "Dallas")) 
      .Select(customer => new { /*...*/ }); 

आपका दूसरे उदाहरण लगभग ठीक ही है, है यह Where के स्थान पर एक बाहरी Any का उपयोग करता है को छोड़कर। यहाँ यह, इसके बाद के संस्करण कोड से मिलान करने के स्वरूपित है:

var result = Customer 
      .Any(c => c.CustomerAddress.Any(ca => ca.Address.City == "Largo")); 

आगे को सरल बनाना, तो यह और भी अधिक स्पष्ट क्या हो रहा है हो जाता है:

var result1 = Customer 
       .Where(customer => customer.HasAnyAddressHere); 

var result2 = Customer 
       .Any(customer => customer.HasAnyAddressHere); 

हम देखते हैं Where खंड क्या वास्तव में अपने पहले क्वेरी गाड़ी चला रहा है है। आप इसे अंग्रेजी में लिख सकते हैं:

मुझे उन सभी ग्राहकों को दें जिनके पास डलास में कम से कम एक पता है। अपने अन्य पते को अनदेखा करें। यदि किसी ग्राहक के पास डलास में कोई पता नहीं है, तो उसे परिणामों से बाहर फ़िल्टर करें।

जैसा कि आप देख सकते हैं, यह ग्राहकों की एक सूची मांग रहा है। दूसरा एक काम करता है:

क्या कम से कम एक ग्राहक है जिसके पास डलास में कम से कम एक पता है?

यह एक हां/कोई प्रश्न नहीं है, इसलिए यह सच या गलत हो जाता है।

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