LINQ ऑन क्लॉज में कई शर्तों के साथ जुड़ें


93

मैं LINQ में एक क्वेरी को लागू करने की कोशिश कर रहा हूँ जो ON क्लाज में कई शर्तों के साथ एक लेफ्ट बाहरी जॉइन का उपयोग करता है।

मैं निम्नलिखित दो तालिकाओं के प्रोजेक्ट (ProjectID, ProjectName) और टास्क (TaskID, ProjectID, TaskName, पूर्ण) के उदाहरण का उपयोग करूँगा । मैं सभी परियोजनाओं की पूरी सूची उनके संबंधित कार्यों के साथ देखना चाहता हूं, लेकिन केवल उन कार्यों को पूरा किया जाता है।

मैं एक फ़िल्टर का उपयोग नहीं कर सकता Completed == trueक्योंकि यह उन परियोजनाओं को फ़िल्टर कर देगा जिनके पास कार्य पूरा नहीं है। इसके बजाय मैं Completed == trueशामिल होने के ON क्लॉज में जोड़ना चाहता हूं ताकि परियोजनाओं की पूरी सूची दिखाई जाएगी, लेकिन केवल पूर्ण किए गए कार्यों को दिखाया जाएगा। पूर्ण कार्य नहीं करने वाली परियोजनाएँ टास्क के लिए एक शून्य मान के साथ एक एकल पंक्ति दिखाएंगी।

यहाँ क्वेरी की नींव है।

from t1 in Projects
join t2 in Tasks
on new { t1.ProjectID} equals new { t2.ProjectID } into j1
from j2 in j1.DefaultIfEmpty()
select new { t1.ProjectName, t2.TaskName }

मैं && t2.Completed == trueखंड पर कैसे जोड़ूँ ?

मैं ऐसा करने के लिए कैसे कोई LINQ प्रलेखन खोजने के लिए प्रतीत नहीं कर सकते।


संबंधित जवाब यहाँ लैम्ब्डा सिंटैक्स का उपयोग करते हुए
स्टुअर्टएलसी

जवाबों:


130

आपको बस दोनों तरफ बेनामी संपत्ति को एक ही नाम देना होगा

on new { t1.ProjectID, SecondProperty = true } equals 
   new { t2.ProjectID, SecondProperty = t2.Completed } into j1

@Svick की टिप्पणियों के आधार पर, यहां एक और कार्यान्वयन है जो अधिक समझ में आ सकता है:

from t1 in Projects
from t2 in Tasks.Where(x => t1.ProjectID == x.ProjectID && x.Completed == true)
                .DefaultIfEmpty()
select new { t1.ProjectName, t2.TaskName }

2
ऐसा लगता है कि ऐसा करने के लिए एक गैर स्पष्ट तरीका है। मुझे यकीन नहीं है कि मैं समझ पाऊंगा कि यह क्या करना है।
16

1
@svick - अनाम प्रकारों के उपयोग से आप कई मानदंडों पर जुड़ सकते हैं। आपको केवल यह सुनिश्चित करने की आवश्यकता है कि संपत्ति के नाम दोनों प्रकारों पर मेल खाते हैं। निश्चित नहीं है कि भ्रम कहां से आ रहा है?
16

भ्रम यह है कि यह वास्तव में और अधिक समझ में आता है क्योंकि दो समानताएं शामिल हैं and, न कि कुछ "अजीब" वस्तु की समानता। और मेरी बात को साबित करने के लिए, आपका कोड गलत है। इस काम के लिए, आपको trueबाईं ओर और t2.Completeदाईं ओर होना होगा।
svick

1
धन्यवाद Aducci। मुझे संदर्भ को सही पाने के लिए क्वेरी में साइड स्वैप करना था, लेकिन यह काम किया। इस समस्या का सरलीकरण किया गया है, और मेरी वास्तविक दुनिया की समस्या में यह नहीं है कि केवल सेकंडप्रॉपर्टी सही है या गलत है, सेकंडप्रॉपर्टी एक पूर्णांक है और मैं उपयोग करता हूं AND SecondProperty IN (123, 456)। मैं उस चुनौती पर आगे बढ़ूंगा और आपको जो भी मदद दे सकता है, उसकी बहुत सराहना की जाएगी।
कुयेंडा

@svick - अच्छी पकड़, मैंने t2 का क्रम बदल दिया। पूरा और सही मूल्य। मैंने एक और उपाय जोड़ा जो आपके लिए कम अजीब हो सकता है।
17

39

यहाँ आप के साथ जाना:

from b in _dbContext.Burden 
join bl in _dbContext.BurdenLookups on
new { Organization_Type = b.Organization_Type_ID, Cost_Type = b.Cost_Type_ID } equals
new { Organization_Type = bl.Organization_Type_ID, Cost_Type = bl.Cost_Type_ID }

यह अधिक समझ में आता है।
बिजय यादव

1

आप ऐसा नहीं कर सकते। joinखंड (और Join()विस्तार विधि) केवल equijoins का समर्थन करता है। यह भी कारण है, क्यों यह उपयोग करता है equalsऔर नहीं ==। और यहां तक ​​कि अगर आप ऐसा कुछ कर सकते हैं, तो यह काम नहीं करेगा, क्योंकि joinएक आंतरिक जुड़ाव है, बाहरी जुड़ाव नहीं।


बाहरी जुड़ाव का अनुरोध नहीं किया गया था, और (अन्य उत्तर देखें), जाहिर है आप कर सकते हैं।
edc65

0

यह 2 टेबल के लिए ठीक काम करता है। मेरे पास 3 टेबल हैं और क्लॉज पर 3 टेबल से 2 शर्तों को लिंक करना है। मेरा कोड:

p से _dbContext.Products में pv से _dbContext.ProductVariants पर p.ProduktId के बराबर pv.ProduktId, jJ से जुड़ते हैं, बाकि jJoinQuery में नए {VariantId = pv.Vid, ProductId = p.ProduktId} से नए वीडियो के बराबर होते हैं। ProductId = jpr.Prices.ProduktID} lj में

लेकिन इस बिंदु पर इसकी त्रुटि दिखाई दे रही है: pv में _dbContext.ProductVariants को p.ProduktId के बराबर जोड़ें pv.ProduktId

त्रुटि: ज्वाइन क्लॉज में से किसी एक का प्रकार गलत है। 'GroupJoin' के लिए कॉल में टाइप इंफ़ेक्शन विफल रहा।

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