2009-07-20 15 views
8

में orderby मैं निम्नलिखित इकाई कोड है, जो सभी उपयोगकर्ताओं लौट आते हैं और "भी शामिल है" उनके नमूने के सभी अनुरोधों:LINQ ".Include" सबक्वेरी

var userQuery = from u in _IntranetContext.UserSet.Include("SampleRequests") 
          orderby u.LastName ascending 
          select u; 

प्रत्येक उपयोगकर्ता कई SampleRequests है। प्रत्येक नमूना जांच में एक आईडी # (केवल एक पूर्णांक: 1, 22, 341, आदि) है। संस्थाओं के लिए ऊपर LINQ पकड़ लेता है उपयोगकर्ताओं और उनकी SampleRequests तो जैसे:

User 1: 33, 22, 341, 12

User 2: 24, 3, 981

आप देख सकते हैं SampleRequest आईडी # आरोही क्रम में नहीं हैं। मैं परिणाम क्रम में होना चाहता हूँ।

मैं कैसे पर शामिल SampleRequests आईडी # orderby बाधा डाल कर

कृपया ध्यान दें: SampleRequestId SampleRequest की संपत्ति ... उपयोगकर्ता वस्तु की नहीं एक संपत्ति

+1

एक ही समस्या थी। मिला ... [http://stackoverflow.com/questions/1304556/linq-orderby-name-thenby-childrencollection-name ](httpoverflow.com/questions/1304556/linq-orderby-name-thenby- बच्चों के चयन-नाम) – kervin

उत्तर

8

मैं वर्तमान में आप क्या चाहते हैं के लिए दो विकल्प के बारे में सोच सकते हैं। आप उन्हें एक नया वर्ग है, जहां उपयोगकर्ता और संबद्ध अनुरोध गुण हैं में चुन सकते हैं:

var userQuery = from u in _IntranetContext.UserSet.Include("SampleRequests") 
       orderby u.LastName ascending 
       select new 
       { 
        User = u, 
        SampleRequests = u.SampleRequests.OrderByDescending(r => r.SampleRequestId) 
       }; 

यह मुद्दों का कारण होगा यदि आप, इस प्रकार के वापस जाने के लिए के रूप में यह अनाम है चाहता था।

तुम भी एक नया उपयोगकर्ता वस्तु, इस के समान में इस चुन सकते हैं:

var userQuery = from u in _IntranetContext.UserSet.Include("SampleRequests") 
       orderby u.LastName ascending 
       select new User 
       { 
        Property1 = u.Property1, 
        Property2 = u.Property2, 
        Property3 = u.Property3, 
        SampleRequests = u.SampleRequests.OrderByDescending(r => r.SampleRequestId).ToList() 
       }; 

इस उपयोगकर्ता वस्तुओं का संग्रह वापस आ जाएगी, लेकिन डेटाबेस में वस्तुओं अपडेट करने में समस्याएं पैदा कर सकता है।

+1

तो उपयोगकर्ता एक एफई इकाई है, आप() अपने OrderByDescending का परिणाम नहीं सौंप सकते। ToList() उपयोगकर्ता पर SampleRequests संपत्ति के लिए कॉल (एक सूची ), के बाद से अपनी तरह EntityCollection हो जाएगा। साथ ही, मैं क्वेरी में प्रत्येक संपत्ति को मैन्युअल रूप से असाइन करने से सावधान रहूंगा; यदि आप बाद में ट्रैक के नीचे उपयोगकर्ता को एक नई संपत्ति जोड़ते हैं और अपने सभी प्रश्नों को अपडेट करना भूल जाते हैं, तो आपको उस संपत्ति के बिना उपयोगकर्ता के उदाहरण मिलेंगे। आईएमओ यह एक रखरखाव पिटा हो सकता है। –

+0

यदि आपके उपयोगकर्ता-वर्ग में बहुत अधिक गुण हैं तो मुझे यह बहुत बदसूरत लगता है। क्या यह subcollection.ToList() व्यापार तर्क और एसक्यूएल-सर्वर के बीच बहुत अधिक हस्तांतरण करेगा? एक समाधान केवल आदेश के बिना SampleRequests ला सकता है और फिर बाद में उन्हें C# -code (= स्मृति) में सॉर्ट कर सकता है। –

+0

आपको UserSet.LastName में एक क्रमबद्ध डेटाबेस इंडेक्स बनाना चाहिए। और दूसरा नमूनाकरण के साथ (उपयोगकर्ता कुंजी और नमूना RequestId के लिए विदेशी कुंजी) –

-1

बस एक और आदेश पैरामीटर जोड़ने है ऑर्डरबी पर:

var userQuery = from u in _IntranetContext.UserSet.Include("SampleRequests") 
          orderby u.LastName ascending, 
            u.SampleRequestId descending 
          select u; 
+0

धन्यवाद, लेकिन SampleRequestId नमूना अनुरोधों की एक संपत्ति है, उपयोगकर्ता ऑब्जेक्ट का नहीं। –

+0

@ जॉन: यह एकमात्र उत्तर है जिसे मैंने आपके वर्णन के लिए देखा है। मुझे लगता है कि हमें पहले अधिक जानकारी चाहिए। –

+0

ठीक है, मैं अपने प्रश्न को फिर से लिखता हूं - मुझे लगता है कि यह थोड़ा और स्पष्ट हो सकता है –

-2

संपादित करें: < 15 सेकंड द्वारा निःशुल्क।

var userQuery = from u in _IntranetContext.UserSet.Include("SampleRequests") 
       orderby u.LastName ascending, u.SampleRequestId descending 
       select u; 
+0

धन्यवाद, लेकिन SampleRequestId नमूना अनुरोधों की एक संपत्ति है, उपयोगकर्ता ऑब्जेक्ट की नहीं। –

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