2011-03-28 14 views
7

इसमें परेशानी होने के बाद, मैंने कई उदाहरणों का पालन करने का प्रयास किया है, लेकिन मुझे बस यह नहीं मिल रहा है। यह गैर-लैम्ब्डा मार्ग का उपयोग करके सही समझ में आता है, लेकिन मैं लैम्ब्डा अभिव्यक्तियों का उपयोग करके कैसे शामिल हो सकता हूं?लिंक से एसक्यूएल लैम्ब्डा

var fullData = myCats.Join(myHouses, a => a.id, b => b.id, (a, b) => a); 

जो मैं एक तरह से इतने पर अन्य उदाहरण को देख के माध्यम से मिल गया है, लेकिन fullData टाइप IEnumerable<Cat> तो मैं इसे बंद मकान से किसी भी गुण खींच नहीं कर सकता है:

var myCats = GetAllCats(); 
var myHouses = GetAllHouses(); 

// pseudosql: select * from a inner join b on a.id = b.id 

मैं इस कोशिश की है।

उत्तर

28
var fullData = myCats.Join(
       myHouses, 
       cat => cat.id, 
       house => house.id, 
       (cat, house) => 
        new 
        { 
        Cat = cat, 
        House = house 
        }); 
के माध्यम से प्रवेश fullData.First().Cat... या fullData.First().House...

+0

बहुत बढ़िया धन्यवाद! – NibblyPig

+6

'foo' और' bar' से अधिक संदर्भ वाले चर का उपयोग करने के लिए धन्यवाद। –

+0

ने लैम्ब्डा पैरामीटर को भी बदल दिया, इसलिए यह अधिक पठनीय है। – Femaref

5

है यही कारण है कि अंतिम तर्क (a, b) => a केवल बिल्लियों के लिए वापसी परिणाम नक्शा है, यानी यह (cat, house) => cat

कि आपको अस्थायी वस्तु जोड़ी के साथ जैसे लौट सकते हैं इसका मतलब है क्योंकि

(cat, house) => new { cat, house } 
6

समस्या है, इस बात का परिणाम आपके शामिल होने के - शामिल हों विधि के अंतिम पैरामीटर - एक Cat कारण है कि fullData प्रकार IEnumerable<Cat> की है कि है। यदि आप दोनों को एक्सेस करना चाहते हैं, तो एक अनाम प्रकार:

var fullData = myCats.Join(myHouses, a => a.id, 
            b => b.id, 
            (a, b) => new { Cat = a, House = b}); 
5

आपको यह परिभाषित करने की आवश्यकता है कि आप उनसे क्या चुनना चाहते हैं।

आप बदल सकते हैं अपने बाद के लिए:

class anonymous 
{ 
    Cat cat, 
    House house 
} 

LINQy प्रारूप में बराबर है:

from cat in myCats join house in myHouses 
    on cat.id equals house.id 
    select new {cat, house} 

var fullData = myCats.Join(myHouses, cat => cat.id, house => house.id, (cat, house) => new {cat, house}) 

जो fullData कर देगा एक गुमनाम प्रकार है कि लगता है कि के एक IQueryable

अपशिष्ट से बचने के लिए आप जो भी चुनना चाहते हैं उसे निर्दिष्ट कर सकते हैं:

from cat in myCats join house in myHouses 
    on cat.id equals house.id 
    select new {cat.id, cat.name, house.address} 
संबंधित मुद्दे