2011-06-06 11 views
35

सी # में LINQ क्वेरी लिखते समय, मुझे पता है कि मैं join कीवर्ड का उपयोग करके शामिल हो सकता हूं। लेकिन निम्नलिखित क्या करते हैं?LINQ एकाधिक से क्लॉज

from c in Companies 
from e in c.Employees 
select e; 

एक LINQ किताब मेरे पास है कहते हैं कि यह में शामिल होने का एक प्रकार है, लेकिन एक उचित नहीं शामिल हो (जो join कीवर्ड का उपयोग करता है)। तो फिर वास्तव में किस तरह का जुड़ाव है?

+1

लिंक-टू-ऑब्जेक्ट्स, -एसक्ल, -इन्टिटीज? इन-ऑब्जेक्ट्स, यह शामिल नहीं है, लेकिन 'SelectMany' ऑपरेशन' है। दूसरों में, डेटा के आधार पर इसे बाएं या भीतरी में अनुवादित किया जा सकता है। –

+0

@ एंथनी: मैंने LINQ का इतना उपयोग नहीं किया है। तो मेरा सवाल सामान्य रूप से सामान्य था और किसी भी विशिष्ट प्रदाता तक ही सीमित नहीं था। हालांकि, आखिरकार, मैं शायद LINQ से इकाइयों के साथ समाप्त हो जाऊंगा। –

उत्तर

39

एकाधिक "से" कथन को यौगिक लिनक स्टेटमेंट माना जाता है। वे घोंसला foreach बयान की तरह हैं। MSDN पेज एक महान उदाहरण here

var scoreQuery = from student in students 
         from score in student.Scores 
          where score > 90 
          select new { Last = student.LastName, score }; 

सूची करता है इस बयान के रूप में लिखा जा सकता है:

SomeDupCollection<string, decimal> nameScore = new SomeDupCollection<string, float>(); 
foreach(Student curStudent in students) 
{ 
    foreach(Score curScore in curStudent.scores) 
    { 
     if (curScore > 90) 
     { 
     nameScore.Add(curStudent.LastName, curScore); 
     } 
    } 
} 
24

इसे SelectMany() कॉल में अनुवादित किया जाएगा। यह अनिवार्य रूप से एक क्रॉस-जॉइन है।

जॉन स्कीट Edulinq series के हिस्से के रूप में अपने ब्लॉग पर इसके बारे में बात करता है। (तक नीचे स्क्रॉल करें माध्यमिक "से"।)

-1

ऑब्जेक्ट्स के सभी पहले सेट ऑब्जेक्ट्स के दूसरे सेट के साथ जुड़ जाएंगे। उदाहरण के लिए, निम्नलिखित परीक्षण पास हो जाएगा ...

[TestMethod()] 
    public void TestJoin() 
    { 
     var list1 = new List<Object1>(); 
     var list2 = new List<Object2>(); 

     list1.Add(new Object1 { Prop1 = 1, Prop2 = "2" }); 
     list1.Add(new Object1 { Prop1 = 4, Prop2 = "2av" }); 
     list1.Add(new Object1 { Prop1 = 5, Prop2 = "2gks" }); 

     list2.Add(new Object2 { Prop1 = 3, Prop2 = "wq" }); 
     list2.Add(new Object2 { Prop1 = 9, Prop2 = "sdf" }); 

     var list = (from l1 in list1 
        from l2 in list2 
        select l1).ToList(); 

     Assert.AreEqual(6, list.Count); 

    } 
+1

यह प्रश्न में कोड के समान परिदृश्य नहीं है। आप एक कार्टशियन उत्पाद का प्रदर्शन कर रहे हैं, यह वह नहीं है। –

16

कोड आप सूचीबद्ध कि:

from c in company 
from e in c.Employees 
select e; 

... एक सूची का उत्पादन करेगा company परिवर्तनीय में प्रत्येक कंपनी के लिए प्रत्येक कर्मचारी का। यदि कोई कर्मचारी दो कंपनियों के लिए काम करता है, तो उन्हें दो बार सूची में शामिल किया जाएगा।

जब आप c.Employees कहते हैं तो केवल "शामिल" हो सकता है। एक एसक्यूएल समर्थित बैक प्रदाता में, यह Company तालिका से Employee तालिका में आंतरिक प्रवेश में अनुवाद करेगा।

हालांकि

, डबल from निर्माण अक्सर प्रदर्शन करने के लिए "मिलती है" मैन्युअल रूप से, जैसे इतना प्रयोग किया जाता है:

from c in companies 
from e in employees 
where c.CompanyId == e.CompanyId 
select e; 

इस कोड को आप पोस्ट के रूप में एक समान प्रभाव, के आधार पर संभावित सूक्ष्म अंतर के साथ होता है क्या employees चर शामिल हैं। यह भी निम्नलिखित join के बराबर होगा:

from c in companies 
join e in employees 
    on c.CompanyId equals e.CompanyId 
select e; 

आप एक कार्तीय उत्पाद चाहता था अगर, हालांकि, आप बस where खंड को दूर कर सकता है। (यह कुछ भी लायक बनाने के लिए, आप शायद select थोड़ा भी बदलने के लिए है, हालांकि चाहते हैं।)

from c in companies 
from e in employees 
select new {c, e}; 

यह पिछले क्वेरी आप कंपनी और कर्मचारियों के हर संभव संयोजन देना होगा।

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