विधि वाक्यविन्यास के साथ linq to sql में कैसे जुड़ें?


193

मैंने LINQ से SQL उदाहरणों में बहुत सारे उदाहरण देखे हैं कि कैसे क्वेरी सिंटैक्स में शामिल हो सकते हैं, लेकिन मैं सोच रहा हूँ कि इसे विधि सिंटैक्स के साथ कैसे किया जाए? उदाहरण के लिए मैं निम्नलिखित कैसे कर सकता हूं

var result = from sc in enumerableOfSomeClass
             join soc in enumerableOfSomeOtherClass
             on sc.Property1 equals soc.Property2
             select new { SomeClass = sc, SomeOtherClass = soc }

के साथ .Join()? क्या कोई इसका उदाहरण या दूसरा सरल उदाहरण दे सकता है?

जवाबों:


285
var result = from sc in enumerableOfSomeClass
             join soc in enumerableOfSomeOtherClass
             on sc.Property1 equals soc.Property2
             select new { SomeClass = sc, SomeOtherClass = soc };

के बराबर होगा:

var result = enumerableOfSomeClass
    .Join(enumerableOfSomeOtherClass,
          sc => sc.Property1,
          soc => soc.Property2,
          (sc, soc) => new
                       {
                           SomeClass = sc,
                           SomeOtherClass = soc
                       });

जैसा कि आप देख सकते हैं, जब यह जुड़ने की बात आती है, तो क्वेरी सिंटैक्स आमतौर पर लैम्ब्डा सिंटैक्स की तुलना में बहुत अधिक पठनीय होता है।


129

जस्टिन ने उस मामले में विस्तार को सही ढंग से दिखाया है जिसमें शामिल होने के बाद ए select। यदि आपको कुछ और मिला है, तो यह पारदर्शी पहचानकर्ताओं के कारण अधिक पेचीदा हो जाता है - तंत्र # C कंपाइलर जुड़ने के दोनों हिस्सों के दायरे को फैलाने के लिए उपयोग करता है।

इसलिए जस्टिन के उदाहरण को थोड़ा बदलना:

var result = from sc in enumerableOfSomeClass
             join soc in enumerableOfSomeOtherClass
             on sc.Property1 equals soc.Property2
             where sc.X + sc.Y == 10
             select new { SomeClass = sc, SomeOtherClass = soc }

कुछ इस तरह से परिवर्तित किया जाएगा:

var result = enumerableOfSomeClass
    .Join(enumerableOfSomeOtherClass,
          sc => sc.Property1,
          soc => soc.Property2,
          (sc, soc) => new { sc, soc })
    .Where(z => z.sc.X + z.sc.Y == 10)
    .Select(z => new { SomeClass = z.sc, SomeOtherClass = z.soc });

zयहाँ पारदर्शी पहचानकर्ता है - लेकिन क्योंकि यह पारदर्शी है, तो आप इसे मूल क्वेरी में नहीं देख सकते हैं :)


5

यहाँ अन्य उत्तरों को जोड़ने के लिए, यदि आप एक तीसरे भिन्न प्रकार की एक नई वस्तु बनाना चाहते हैं जहाँ एक क्लॉज़ है (जैसे एक जो आपकी एंटिटी फ्रेमवर्क ऑब्जेक्ट नहीं है) आप यह कर सकते हैं:

public IEnumerable<ThirdNonEntityClass> demoMethod(IEnumerable<int> property1Values)
{
    using(var entityFrameworkObjectContext = new EntityFrameworkObjectContext )
    {
        var result = entityFrameworkObjectContext.SomeClass
            .Join(entityFrameworkObjectContext.SomeOtherClass,
                sc => sc.property1,
                soc => soc.property2,
                (sc, soc) => new {sc, soc})
            .Where(s => propertyValues.Any(pvals => pvals == es.sc.property1)
            .Select(s => new ThirdNonEntityClass 
            {
                dataValue1 = s.sc.dataValueA,
                dataValue2 = s.soc.dataValueB
            })
            .ToList();
    }

    return result;

}    

जहां और चयन खंड में बनाई गई मध्यवर्ती वस्तु पर विशेष ध्यान दें।

ध्यान दें कि यहाँ हम किसी भी सम्मिलित वस्तु की तलाश करते हैं जिसके पास एक गुण 1 है जो इनपुट सूची में से किसी एक से मेल खाता है।

मुझे पता है कि यह मूल पूछने वाले की तुलना में थोड़ा अधिक जटिल है, लेकिन उम्मीद है कि यह किसी की मदद करेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.