LINQ

2011-10-22 9 views
10

में जॉइन के बाद सभी कॉलम का चयन करें मेरे पास दो टेबल, Table1 और Table2 हैं। मैं प्रदर्शन करने के लिए चाहते हैं, कहते हैं, एक बाएं बाहरी में शामिल होने:LINQ

var myOutput = from object1 in Table1 
       join object2 in Table2 
       on object1.Property1 equals object2.Property2 into Table3 
       from output in Table3.DefaultIfEmpty() 
       select new 
        { 
         object1.Property1, 
         object1.Property2, 
         //... 
         output.Property3, 
         output.Property4, 
         //... 
        }; 

तुम नोटिस सकते हैं, मैं जिसके परिणामस्वरूप मेज से दोनों वस्तुओं के सभी गुण (enumerables जबकि शामिल होने की सोची कुछ प्रकार की वस्तुओं को शामिल चयन करना चाहते हैं - ये दोनों संबंधों के लिए अलग हैं)। बेशक, मैं अज्ञात चयन में गुणों का चयन कर सकता हूं, जैसा कि उदाहरण में दिखाया गया है।

मेरा प्रश्न है कि सभी गुण मैन्युअल रूप से निर्दिष्ट करने से कैसे बचें? मुझे SELECT * FROM TABLE3 जैसे कुछ होना चाहिए, जहां TABLE3 एक परिणामस्वरूप संबंध है (TABLE1 और TABLE2 में शामिल होने के बाद)।

सुराग के लिए अग्रिम धन्यवाद।

उत्तर

10

यदि आप एक चतुर प्रकार में प्रोजेक्ट करना चाहते हैं तो आपको प्रत्येक मैन्युअल रूप से निर्दिष्ट करना होगा। आपका दूसरा विकल्प सिर्फ आपके संयुक्त प्रकार में दोनों ऑब्जेक्ट्स रखना है, और ऑब्जेक्ट स्वाभाविक रूप से उनके गुणों के साथ लाएंगे।

select new 
{ 
    Object1 = object1, 
    Object2 = output 
}; 

और तुम myObj.Object1.Property1, myObj.Object2.Property4 की तरह इसके साथ काम करेंगे, आदि

एक अंतिम विकल्प है कि अभी भी कुछ मैनुअल काम शामिल है एक उचित प्रकार को परिभाषित और एक निर्माता या एक बिल्डर विधि है कि है अपने ऑब्जेक्ट गुणों को एक चतुर प्रकार में विभाजित करने का कार्य। आप अभी भी मैन्युअल मैपिंग निष्पादित करते हैं, लेकिन आप इसे अपने क्वेरी तर्क से अलग करते हैं।

select new CombinedType(object1, output); 
//or 
select builder.GetCombinedType(object1, output); 
+0

असाइनमेंट के दौरान ToString() विधि का पहला विकल्प उपयोग नहीं करता है? उस मामले में मुझे myOutput.ToArray() ... – Jamie

+0

करने के बाद ऑब्जेक्ट 1 नामक कॉलम में "नेमस्पेस। माइटाइप" मान मिलेगा, नहीं, यह 'ToString()' का आह्वान नहीं करेगा, जो आपको यह विचार देता है कि यह होगा ? क्या आप इसे किसी प्रकार के यूआई नियंत्रण में बाध्य कर रहे हैं? * नियंत्रण * 'ToString()' का आह्वान कर सकता है, लेकिन क्वेरी स्वयं ही प्रामाणिक है, टीटी बस पूरी वस्तु का उपयोग करती है और इसे किसी संपत्ति पर मैप करती है। –

+0

आपकी टिप्पणी ने मुझे एक विचार दिया - मैंने एक नई कक्षा बनाई है जिसमें दोनों वस्तुओं के संदर्भ शामिल हैं। फिर इनके कुछ गुणों से जुड़ना आसान है :) – Jamie

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