2013-02-06 13 views
15

मैं संबंधित इकाइयों के उप-समूह में नेविगेशन प्रॉपर्टी फ़िल्टर करने के लिए लिंक का उपयोग करके एक रास्ता खोजना चाहता हूं। मैं इस विषय के आसपास सभी जवाब पता जैसे एक गुमनाम चयनकर्ता का सुझाव देते हैं:EntityFramework 5 फ़िल्टर एक शामिल नेविगेशन प्रॉपर्टी

query.Where(x => x.Users.Any(y => y.ID == actingUser.ID)) 
    .Select(x => new 
    { 
     Event = x, 
     Discussions = x.Discussions.Where(actingUser.GenerateSecurityFilterFor<Domain.Discussion>()) 
    }) 
    .OrderBy(x => x.Discussions.Count()) 
    .ThenBy(x => x.Event.Name); 

बहरहाल, यह हमारे क्वेरी पीढ़ी के सामान्य प्रकृति के कारण आदर्श तुलना में काफी कम है और यह भी काफी भीषण एसक्यूएल प्रश्नों पैदावार यदि आप ऊपर फेंक प्रोफाइलर।

मैं की तरह कुछ हासिल करने के लिए सक्षम होने के लिए करना चाहते हैं:

query.Include(x => x.Discussions.Where(actingUser.GenerateSecurityFilterFor<Domain.Discussion>())) 
     .OrderBy(x => x.Discussions.Count()) 
     .ThenBy(x => x.Name); 

मुझे लगता है कि इस EF5 (या उस बात के लिए किसी भी संस्करण) में समर्थित नहीं है लेकिन वहाँ बाधित पूरा करने के लिए एक तरह से हो गया है परिणाम अज्ञात प्रकार के चयन बयान में डेल किए बिना लिंक के माध्यम से सेट किया गया।

मैं की धुन के लिए कुछ कर रही प्रयास किया है:

query.GroupJoin(discquqery, 
    x => x.ID, 
    x => x.Event.ID, 
    (evt, disc) => evt.Discussions = disc.Where(actingUser.GenerateSecurityFilterFor<Domain.Discussion>())).ToList(); 

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

मुझे लगता है मैं समझ नहीं सकता क्यों एफई (है कि मैं पा सकते हैं) उत्पन्न करने के लिए एक तरीका प्रदान नहीं करता है:

SELECT 
    --Properties 
FROM Event e 
LEFT OUTER JOIN Discussions d 
    ON e.ID = d.EventID AND --Additional constraints 
WHERE 
    --Where conditions 
ORDER BY 
    --Order Conditions 

यह करने के लिए एक रास्ता एसक्यूएल में वहाँ है, शामिल विवश करने के लिए बहुत आसान है यह लिंक के माध्यम से भी।

पीएस: मैंने स्टैक, एमएसडीएन, विशेषज्ञों-विनिमय आदि की खोज की है। कृपया महसूस करें कि यह एक डुप्लिकेट नहीं है। इस विषय पर छूने वाला कुछ भी या तो एक पुलिस-आउट है "यह नहीं किया जा सकता" उत्तर या कोई जवाब नहीं है। इसमें कुछ भी असंभव नहीं है ...

+1

ठीक है, यहां एक "यह किया जा सकता है" उत्तर है: http://stackoverflow.com/a/13904825/861716 –

+5

ईएफ में क्वेरी पीढ़ी इंजन का विस्तार करने के तरीके हैं। तो यह असंभव नहीं है, और यदि यह एकमात्र मार्ग है तो उत्तर ईएफ क्वेरी इंजन का विस्तार है ताकि INNER/बाहरी जॉइन को अतिरिक्त फ़िल्टर शामिल करने की अनुमति मिल सके। कुछ भी असंभव नहीं है ... अगर मुझे ईएफ को दोबारा जोड़ना है तो मैं ... यह एक मौजूदा उत्तर नहीं दे रहा है इसका मतलब है कि इसका उत्तर स्वयं बना रहा है (जो मैं वर्तमान में और यहां तक ​​कि जब मैंने सवाल पूछा, तो करने की योजना बनाई) – VulgarBinary

+4

यही है आत्मा!! –

उत्तर

8

इस विषय पर छूने वाला कुछ भी या तो एक पुलिस आउट है "यह नहीं किया जा सकता" उत्तर या कोई जवाब नहीं। कुछ भी असंभव नहीं है ... इसमें शामिल हैं।

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

वर्तमान संस्करण "यह नहीं किया जा सकता" is the answer के साथ। आप या तो अज्ञात या विशेष अप्रयुक्त प्रकार के प्रक्षेपण का उपयोग कर सकते हैं जैसा कि आपने अपने प्रश्न की शुरुआत में वर्णित किया है। अन्य विकल्प सभी माता-पिता के लिए संबंधित इकाइयों को लोड करने के लिए एकल माता-पिता या अलग-अलग क्वेरी के लिए संबंधित इकाइयों को लोड करने के लिए अलग-अलग स्पष्ट क्वेरी हैं।

एकल अभिभावक के लिए लोड संबंधों: सभी माता पिता के लिए

context.Entry(event) 
     .Collection(e => e.Discussions) 
     .Query() 
     .Where(d => ...) 
     .Load(); 

लोड संबंधों (आलसी लोड हो रहा है की आवश्यकता है या ऑफ़ करना):

// load all parents 
var events = query.Where(e => ...).ToList(); 

// load child filtered by same condition for parents and new condition for children 
childQuery.Where(d => e.Event ... && d.Something ...).Load(); 

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

+0

तो जाहिर है कि मैं ईएफ 5 कोर का विस्तार कर रहा हूं। क्या आपको पता है कि पूरे डीएलएल को संशोधित करने और पुन: संकलित करने के बजाय विस्तार करने का कोई तरीका है या नहीं? – VulgarBinary

+1

आपको डीएलएल को फिर से कंपाइल करना होगा। आप [ईएफ कोडप्लेक्स साइट] (http://entityframework.codeplex.com/discussions) पर जा सकते हैं और ईएफ टीम के साथ सीधे इस योगदान पर चर्चा कर सकते हैं - वे इस सुविधा के लिए पहले ही कुछ उच्च स्तरीय डिज़ाइन कर सकते हैं और इसे आपके साथ साझा कर सकते हैं। –

+3

फ़िल्टर किए गए फ़िल्टर के लिए वोट दें [यहां] (https://entityframework.codeplex.com/workitem/47)! – Chris

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