2011-01-18 9 views
10

मेरे पास Group और User इकाइयां हैं।
Group इकाई में Users संपत्ति है जो उपयोगकर्ताओं की एक सूची है।
उपयोगकर्ता की संपत्ति IsEnabled है।लिंक टू एंटिटीज - ​​बच्चों की इकाइयों पर फ़िल्टर कैसे करें

मैं एक लिनक क्वेरी लिखना चाहता हूं जो Group एस की एक सूची लौटाता है, जिसमें केवल User एस होते हैं जिनके IsEnabled सत्य हैं।

उदाहरण के लिए इतना

, जैसे डेटा के लिए नीचे दिए गए
AllGroups
ग्रुप ए
उपयोगकर्ता 1 (IsEnabled = true)
उपयोगकर्ता 2 (IsEnabled = true)
उपयोगकर्ता 3 (IsEnabled = false)

ग्रुप बी
उपयोगकर्ता 4 (IsEnabled = true)
उपयोगकर्ता 5 (IsEnabled = false)
उपयोगकर्ता 6 (IsEnabled = false)

मैं
FilteredGroups
ग्रुप ए प्राप्त करना चाहते हैं
उपयोगकर्ता 1 (IsEnabled = true)
उपयोगकर्ता 2 (IsEnabled = true)

समूह बी
उपयोगकर्ता 4 (IsEnabled = true)

मैं निम्न क्वेरी कोशिश की, लेकिन दृश्य स्टूडियो मुझसे कहता है कि
[करने के लिए संपत्ति या इंडेक्सर 'उपयोगकर्ता' आवंटित नहीं किया जा सकता है - यह पढ़ने के लिए है केवल]

FilteredGroups = AllGroups.Select(g => new Group() 
        { 
         ID = g.ID, 
         Name = g.Name, 
         ... 
         Users = g.Users.Where(u => u.IsInactive == false) 
        }); 

आपकी मदद के लिए धन्यवाद!

+0

क्या आप ईएफ 4 का उपयोग कर रहे हैं? यदि हां, तो क्या आप पीओसीओ का उपयोग कर रहे हैं? 'Group.Users' कैसे घोषित किया गया है? – RPM1984

+2

आप आसानी से फ़िल्टर किए गए शामिल के साथ इसे प्राप्त कर सकते हैं। सुविधा के लिए वोट दें [यहां] (https://entityframework.codeplex.com/workitem/47)! – Chris

उत्तर

8

मैं क्वेरी उल्टा बदल कर ऐसा करने में कामयाब रहे। दूसरी क्वेरी केवल पुनर्प्राप्त डेटा को फिर से ऑर्डर करती है।

नोट: हो सकता है कि आप बाद में अपनी संस्थाओं को उखाड़ फेंकने में सक्षम न हों!

+0

क्या आप इस linq क्वेरी के साथ मेरी मदद कर सकते हैं: http: //stackoverflow.com/questions/38120664/how-to-group-by-on-2-child-entities-and-get-total-of-both-this- बच्चे की संस्थाओं –

9

नहीं "अच्छा" ऐसा करने का तरीका नहीं है, लेकिन आप इस कोशिश कर सकते - परियोजना दोनों, Group और एक गुमनाम ऑबजेक्ट पर फ़िल्टर किया Users सिर्फ Groups, और फिर Select:

var resultObjectList = AllGroups. 
         Select(g => new 
           { 
            GroupItem = g, 
            UserItems = g.Users.Where(u => !u.IsInactive) 
           }).ToList(); 

FilteredGroups = resultObjectList.Select(i => i.GroupItem).ToList(); 

यह 'isn एक दस्तावेजी फीचर नहीं है और ईएफ एसक्यूएल प्रश्नों के निर्माण के तरीके से है - इस मामले में इसे बाल संग्रह को फ़िल्टर करना चाहिए, इसलिए आपकी FilteredGroups सूची में केवल सक्रिय उपयोगकर्ता होंगे।

इस काम करता है, तो आप कोड विलय की कोशिश कर सकते हैं:

FilteredGroups = AllGroups. 
       Select(g => new 
           { 
            GroupItem = g, 
            UserItems = g.Users.Where(u => !u.IsInactive) 
           }). 
       Select(r => r.GroupItem). 
       ToList(); 

(यह अपरीक्षित है और परिणाम कैसे एफई दूसरा Select पर कार्रवाई करेंगे पर निर्भर करता है, तो यह अच्छा होगा अगर आप हमें बताएं जो कोशिश करने के बाद विधि काम करता है)।ToList() आप डेटाबेस जो आवश्यक है क्योंकि अन्यथा आस्थगित निष्पादन रास्ते में आता है करने के लिए एक गोल यात्रा के लिए मजबूर का उपयोग करके

var users = (from user in Users.Include("Group") 
      where user.IsEnabled 
      select user).ToList().AsQueryable() 

from (user in users 
     select user.Group).Distinct() 

:

1

कुछ इस तरह कोशिश करते हैं और आप अभी भी अपने संस्थाओं होगा:

FilteredGroups = AllGroups.Select(g => new 
{ 
    Group = g, 
    Users = g.Users.Where(u => u.IsInactive == false) 
}).AsEnumerable().Select(i => i.Group); 

इस तरह आप अभी भी Group.Users

0

उपयोग करने के लिए आप अपने इकाई संरचना बनाए रखने के लिए चाहते हैं सक्षम होना चाहिए, इस कोशिश :

var userGroups = context.Users.Where(u => !u.IsInactive).GroupBy(u => u.Group); 

foreach (var userGroup in userGroups) 
{ 
    // Do group stuff, e.g.: 
    foreach (var user in userGroup) 
    { 
    } 
} 

और आप निश्चित रूप से अपनी संस्थाओं को संशोधित कर सकते हैं!

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