इकाई फ्रेमवर्क 3 तालिकाओं में शामिल हों


133

मैं तीन तालिकाओं में शामिल होने की कोशिश कर रहा हूं, लेकिन मैं इस विधि को नहीं समझ सकता ...

मैंने 2 तालिकाओं को पूरा किया

        var entryPoint = dbContext.tbl_EntryPoint
            .Join(dbContext.tbl_Entry,
                c => c.EID,
                cm => cm.EID,
                (c, cm) => new
                {
                    UID = cm.OwnerUID,
                    TID = cm.TID,
                    EID = c.EID,
                }).
            Where(a => a.UID == user.UID).Take(10);

टेबल

मैं TID_Title तालिका को TID PK के साथ शामिल करना चाहता हूं और शीर्षक फ़ील्ड प्राप्त करना चाहता हूं ।

बहुत बहुत धन्यवाद


इस संबंधित लेख को देखें। यह विधि संकेतन का उपयोग नहीं कर रहा है लेकिन, आपको
जिस्ट

कृपया विस्तारित नेविगेशन गुणों के साथ एक चित्र दिखाएं। नेविगेशन प्रॉपर्टीज रेडी-मेड जॉइन हैं।
गर्ट अर्नोल्ड

जवाबों:


202

मुझे लगता है कि सिंटैक्स-आधारित क्वेरी का उपयोग करना आसान होगा:

var entryPoint = (from ep in dbContext.tbl_EntryPoint
                 join e in dbContext.tbl_Entry on ep.EID equals e.EID
                 join t in dbContext.tbl_Title on e.TID equals t.TID
                 where e.OwnerID == user.UID
                 select new {
                     UID = e.OwnerID,
                     TID = e.TID,
                     Title = t.Title,
                     EID = e.EID
                 }).Take(10);

और आपको संभवतः शीर्ष दस वस्तुओं को सही orderbyसुनिश्चित करने के लिए, क्लॉज़ जोड़ना चाहिए Top(10)


3
विधि के लिए बहुत बहुत धन्यवाद; स्पष्ट काम करता है, लेकिन मैं जवाब देखना चाहता हूं, जैसा कि मैंने पूछा, फिर से बहुत धन्यवाद।
Erçin Dedeoğlu

@MarcinJuraszek: अगर मुझे काम करने के लिए एक ViewModel की आवश्यकता है, तो क्या यह आवश्यक है कि मैं तालिकाओं में शामिल हो?
विनी

यह async के बिना भी काम नहीं करता है। मेरे पास सटीक परिदृश्य है, लेकिन क्वेरी एक अपवाद को फेंकती है [the_list_of_all_return_variables] को अनुक्रमित नहीं किया जा सकता है। @marcinJuraszek - क्या आप stackoverflow.com/questions/42453123/…
सैंडिएजेट

1
उत्तम! आपने मुझे इतना समय बचा लिया :)
मोहम्मदहोसिन R

81

यह अप्रयुक्त है, लेकिन मेरा मानना ​​है कि वाक्यविन्यास को लैम्ब्डा क्वेरी के लिए काम करना चाहिए। जैसे-जैसे आप इस सिंटैक्स के साथ अधिक तालिकाओं के साथ जुड़ते जाते हैं, आपको उन नए मूल्यों में और गिरावट आती जाती है, जिन मूल्यों में आप हेरफेर करना चाहते हैं।

var fullEntries = dbContext.tbl_EntryPoint
    .Join(
        dbContext.tbl_Entry,
        entryPoint => entryPoint.EID,
        entry => entry.EID,
        (entryPoint, entry) => new { entryPoint, entry }
    )
    .Join(
        dbContext.tbl_Title,
        combinedEntry => combinedEntry.entry.TID,
        title => title.TID,
        (combinedEntry, title) => new 
        {
            UID = combinedEntry.entry.OwnerUID,
            TID = combinedEntry.entry.TID,
            EID = combinedEntry.entryPoint.EID,
            Title = title.Title
        }
    )
    .Where(fullEntry => fullEntry.UID == user.UID)
    .Take(10);

17
वह छिपा हुआ है। अगर मुझे कभी उत्पादन कोड में ऐसी कोई क्वेरी मिली तो मैं तुरंत इसे रिफ्लेक्टर करूंगा। प्रश्न के उत्तर के लिए +1, हालांकि पूछा गया!
डैन बेहार्ड

8
@Dan of curiosity यह सिर्फ c, cm, और ccm के साथ सभी नामकरण सम्मेलनों में नहीं सोचा गया है, या बस linq और लैम्ब्डा के उपयोग से जुड़ने के लिए आवश्यक सिंटैक्स है जो घृणित है? यदि पूर्व, और आप बेहतर लेआउट के लिए पोस्ट को संपादित करना चाहते हैं, तो हर तरह से। मैं अभी भी इकाई ढांचे के लिए नया हूं और अभी भी सर्वश्रेष्ठ प्रथाओं में भिगो रहा हूं, यदि आपके पास भविष्य के उपयोगकर्ताओं के लिए इस उत्तर को अधिक स्पष्ट करने के लिए सुझाव हैं तो मैं सहायता की सराहना करूंगा।
Pynt

4
मैंने टिप्पणी करते समय सटीक कारण को बहुत अधिक सोचा नहीं था, लेकिन निश्चित रूप से नामकरण सम्मेलनों ने पठनीयता को चोट पहुंचाई (ओपी से नकल की गई)। इसके अलावा, लाइन की शुरुआत के रूप में कॉमा ने पठनीयता को बहुत नुकसान पहुँचाया (व्यक्तिपरक, मेरे लिए), और व्हाट्सएप / इंडेंटेशन में थोड़ा सुधार किया जा सकता है। आपके द्वारा अनुरोध करने के बाद मैंने इन सभी (IMHO) सुधारों के साथ एक संपादन प्रस्तुत किया है।
डैन बेहार्ड

2
कोड स्वरूपण अक्सर पक्षपाती होता है, लेकिन सामान्य चीजें हैं जो ज्यादातर लोगों को सहमत बेहतर दिखती हैं। सम्मेलनों के नामकरण के लिए, मैं चीजों को वास्तव में संक्षिप्त नाम कहता था, लेकिन मैं अब बहुत तेजी से टाइप कर सकता हूं (इन्टेलिसेंस जैसी चीजों पर भी विचार नहीं कर रहा है) जो कुछ अक्षर सहेजे गए हैं, वे पठनीयता बनाम नामकरण की चीजों में सत्यता के लायक नहीं हैं, जैसे "एंट्रीआईडी" बनाम "ईआईडी", "संयुक्त" बनाम "सेमी", आदि। आखिरकार, कोई और मेरे कोड को पढ़ने जा रहा है, और मैं नहीं चाहूंगा कि वे मेरी रेखाओं की संख्या के रैखिक कार्य के रूप में मेरे लिए नफरत पैदा करें। कोड उन्हें पढ़ने / बनाए रखने के लिए पड़ा है।
दान बेखरद

5
मैं सिर्फ कॉमा शुरुआती लाइनों के खिलाफ तर्क नहीं मिलता। मैं एक दृढ़ विश्वासी हूं, क्योंकि यह अलग-अलग धाराओं / तर्कों को टिप्पणी करना आसान बनाता है। और यह
प्रीतिकर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.