2011-12-09 7 views
17

मैं निम्नलिखित प्रश्न हैं:कैसे एफई में संस्थाओं के बच्चे संग्रह ऑर्डर करने के लिए

public IEnumerable<Team> GetAllTeamsWithMembers(int ownerUserId) 
     { 
      return _ctx.Teams 
       .Include(x => x.TeamMembers) 
       .Where(x => x.UserId == ownerUserId) 
       .OrderBy(x => x.Name).ToList(); 

     } 

मैं कैसे उनके नाम से टीमों आदेश देने के बारे जाते हो, और उसके बाद के अनुसार क्रमबद्ध प्रत्येक टीम के सभी बच्चे सदस्य उनके नाम?

ऐसा लगता है कि ऐसा करने के लिए मुझे एक नई डीटीओ कक्षा बनाने और चयन का उपयोग करने की आवश्यकता है। मैं पहले से बनाए गए ईएफ इकाइयों का उपयोग करना चाहता हूं, इस मामले में टीम के सदस्यों के लिए एक नेविगेशन संपत्ति है। मैं अपनी रिपोजिटरी परत से IEnumerable<Team> वापस कर देता हूं।

ईएफ में बाल संग्रह का ऑर्डर करने का एक साफ तरीका प्रतीत नहीं होता है। क्या कोई मदद कर सकता है?

+1

यहां कई उदाहरण दिए गए हैं: http://stackoverflow.com/a/7181574/270591, http://stackoverflow.com/a/7528266/270591, http://stackoverflow.com/a/7395406/270591 – Slauma

+0

[ईएफ 4.1 कोड-प्रथम का संभावित डुप्लिकेट: शामिल करें और/या विधियों का चयन करते समय नेविगेशन गुणों को कैसे ऑर्डर करें?] (http://stackoverflow.com/questions/7522784/ef-4-1-code-first-how- टू-ऑर्डर-नेविगेशन-गुण-जब-उपयोग-शामिल-और-या) –

उत्तर

16

आप इसे लोड करने के बाद डेटा लोड कर सकते हैं और स्मृति में सॉर्ट कर सकते हैं।

IEnumerable<Team> teams = _ctx.Teams 
      .Include(x => x.TeamMembers) 
      .Include(x => x.TeamMembers.Select(u => u.User)) 
      .Where(x => x.UserId == ownerUserId) 
      .OrderBy(x => x.Name).ToList(); 

foreach (var team in teams) 
{ 
    team.TeamMembers = team.TeamMembers.OrderBy(m => m.Name); 
    foreach (var teamMember in team.TeamMembers) 
    { 
     teamMember.Users = teamMember.Users.OrderBy(u => u.Name); 
    } 
} 

या आप अनुमान का उपयोग करें और अपने संग्रह को सॉर्ट करने एफई की ट्रैकिंग बदलें इस्तेमाल कर सकते हैं। Here is an example एक फ़िल्टरिंग फ़िल्टर करने के लिए लेकिन आदेश के लिए एक ही काम करता है।

+2

इसके लिए धन्यवाद, सरल और प्रभावी। मैंने सोचा कि कुछ और LINQish हो सकता है, लूप पर उत्सुक नहीं है लेकिन यह काम करता है! – jaffa

2

आपको गुमनाम प्रकार में अपनी टीमों और उनके दल के सदस्यों डंप कर सकता है (शायद नहीं तुम क्या चाहते), इस तरह:

public IEnumerable<Team> GetAllTeamsWithMembers(int ownerUserId) 
{ 
    return (from t in _ctx.Teams 
     where t.UserId == ownerUserId 
     select new { 
      Team = t, 
      TeamMembers = t.TeamMembers.OrderBy(m => m.Name) 
     }).ToList() 
} 

फिर आप उन के माध्यम से पाश:

foreach(Team team in GetAllTeamsWithMembers(1234)) 
{ 
    string teamName = team.Team.Name; 
    string firstTeamMemberName = team.TeamMembers.First().Name; 
} 

अद्यतन: रिकॉर्ड के लिए, मेरी राय इस समाधान का उपयोग नहीं करना है, लेकिन प्रत्येक संग्रह को लूप में या प्रतिपादन/बाध्यकारी के दौरान सॉर्ट करना है।

मैंने दूसरा समाधान हटा दिया, क्योंकि यह इंगित किया गया था कि ईएफ इकाइयों में चयन नहीं कर सकता है।

+0

दूसरा विकल्प दुर्भाग्यवश काम नहीं करता है क्योंकि LINQ से संस्थाएं किसी इकाई में प्रोजेक्ट करने की अनुमति नहीं देती हैं। – Slauma

+0

यदि आप अपनी ToList() के बाद कोई विकल्प जोड़ते हैं तो चयन करें। एक चयन करें (a => a.Team)। –

+0

@ स्लुमा मुझे यह नहीं पता था। –

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