6

ऐसा लगता है कि लिंक से इकाइयां Aggregate विधि का समर्थन नहीं करती हैं। मुझे इस संदेश को .Select(a => a.Permissions).Aggregate((a, b) => a | b) को बड़ी अभिव्यक्ति के हिस्से को फिर से लिखना होगा जो कि लिंक से इकाइयों को समझता है। क्या यह संभव है?इकाइयों से लिंक कुल विधि प्रतिस्थापन

शायद मुझे आपको क्या करना है इसके बारे में बेहतर स्पष्टीकरण देना चाहिए। मुझे इन आयोजकों को उपयोगकर्ता अनुमतियों के आधार पर डेटाबेस से आयोजकों का संग्रह प्राप्त करने की आवश्यकता है। अनुमतियां बिट झंडे के रूप में जमा है और निम्न में से संयोजन कर रहे हैं:

  1. DefaultOrganizerPermissions - हर आयोजक कुछ डिफ़ॉल्ट अनुमतियां है
  2. OwnerPermissions - यदि उपयोगकर्ता आयोजक का स्वामी है, वह कुछ अतिरिक्त अनुमति है
  3. उपयोगकर्ता प्रसंस्करण - उपयोगकर्ताओं को मैन्युअल रूप से ऑर्गनाइज़र
  4. रोलप्रमिशन - उपयोगकर्ता भूमिकाओं के सदस्य हो सकते हैं और इन भूमिकाओं को आयोजकों को अतिरिक्त अनुमतियां दी जा सकती हैं।

तो मैं निम्नलिखित हस्ताक्षर

public IQueryable<Organizer> GetOrganizers(Person person, OrganizerPermissions requiredPermissions)

के साथ एक विधि है और इसके अंदर इस

organizers = organizers.Where(o => ((
     // Default permissions 
     DefaultOrganizerPermissions | 
     // Owner permissions 
     (o.OwnerId == person.Id ? OwnerOrganizerPermissions : 0) | 
     // Personal permissions 
     (o.AccessIdentifier.Accesses.FirstOrDefault(a => a.Accessor is PersonalAccessor && (a.Accessor as PersonalAccessor).PersonId == person.Id) != null ? 
     (OrganizerPermissions)o.AccessIdentifier.Accesses.FirstOrDefault(a => a.Accessor is PersonalAccessor && (a.Accessor as PersonalAccessor).PersonId == person.Id).Permissions : 0) | 
     // Role permissions 
     (o.AccessIdentifier.Accesses.Any(a => a.Accessor is RoleAccessor && (a.Accessor as RoleAccessor).Role.RoleMembers.Any(rm=>rm.PersonId == person.Id)) ? 
     (OrganizerPermissions)o.AccessIdentifier.Accesses.Where(a=> a.Accessor is RoleAccessor && (a.Accessor as RoleAccessor).Role.RoleMembers.Any(rm => rm.PersonId == person.Id)).Select(a=>a.Permissions).Aggregate((a, b) => a | b) : 0) 
     ) & requiredPermissions) == requiredPermissions); 

की तरह एक कोड सरलीकृत यह कुछ इस तरह है:

organizers = organizers.Where(o => ((
     DefaultOrganizerPermissions | 
     OwnerOrganizerPermissions | 
     UserPermisions | 
     RolePermissions 
     ) & requiredPermissions) == requiredPermissions); 

समस्या यह है कि उपयोगकर्ता एकाधिक भूमिकाओं का सदस्य हो सकता है, इसलिए रोलप्रमिशन वास्तव में कई अनुमतियां हैं और मुझे इसे बिटवाई के साथ फ़्लैट करना होगा या। लेकिन कैसे, अगर कुल समर्थित नहीं है?

उत्तर

1

डेटा की मात्रा निषेधात्मक बड़ी नहीं है, तो आप तो अनुमतियां नल आप शायद जरूरत है मेमोरी में डेटा को पढ़ने के लिए और फिर वस्तुओं

+0

मैंने पहले यह कोशिश की है, लेकिन इसका कोई प्रभाव नहीं है। –

+0

क्या आपने इसे आजमाया? .... ToList()। चुनें (ए => ए। पैरामिशन) .ग्रेगेट ((ए, बी) => ए | बी) ToList() क्वेरी को पूरा करता है (इसलिए बुरा है) लेकिन यह काम करना चाहिए ... आप अन्य तरीकों, यानी योग या सही है जो केवल सही है (FirstOrDefault) लेकिन आपको और अधिक स्पष्ट होना चाहिए। – bubi

+0

@bubi हां, मैंने किया। मैं एक ही कक्षा में एक और विधि में ToList() का उपयोग कर रहा हूं और यह काम करता है। लेकिन यह इस में काम नहीं करता है। मुझे लगता है कि यह अजीब बात है, मैं उम्मीद करता हूं कि यह या तो काम करे, या कुछ (अलग) त्रुटि उठाए, लेकिन इसमें कोई बदलाव नहीं है। मुझे बस किसी भी तरह से कई बिट झंडे मर्ज करना चाहिए (उन्हें पूर्णांक के रूप में दर्शाया जाता है), उदाहरण के लिए 1010 | 0011 = 1011. मुझे नहीं पता कि यह Sum के साथ संभव है या नहीं। –

0

को Linq के रूप में सकल प्रदर्शन Select(...) बयान से पहले .ToList() बुला विचार कर सकते हैं
a.Permissions.GetValueOrDefault()
तो क्वेरी
.Select (एक => a.Permissions.GetValueOrDefault()) होना चाहिए डालने के लिए सकल ((क, ख) => एक | ख)।

इसके अलावा, यदि ईएफ प्रदाता समर्थन नहीं करता है एसक्यूएल के लिए कुल अनुवाद (यह हिस्सा प्रदाता विशिष्ट है इसलिए यह एक डीबीएमएस के साथ काम कर सकता है लेकिन एक अलग डीबीएमएस के साथ नहीं) आपको क्वेरी को टोस्टिस्ट() (जैसे @ एसजेगर द्वारा सुझाए गए) के साथ पूरा करने की आवश्यकता है।

संपादित
समस्या यह है कि एफई प्रदाता एसक्यूएल करने के लिए सकल अनुवाद का समर्थन नहीं करता है।

मैं एक एसक्यूएल सर्वर विशेषज्ञ वैसे भी आप करता है कि क्या आप (बिटवाइज़ या) की जरूरत है एक कुल समारोह (योग या औसत) की तरह खोजना चाहिए नहीं कर रहा हूँ। MySQL में BIT_OR() है।

यह

+0

अनुमतिहीन नहीं है, यह हमेशा एक मान है। Tolist() के बाद मैं कुल भाग सफलतापूर्वक निष्पादित कर सकता हूं, यदि यह अभिव्यक्ति वृक्ष का अंतिम विवरण है। लेकिन मुझे इसे बड़ी क्वेरी के हिस्से के रूप में निष्पादित करने की आवश्यकता है, यानी अभिव्यक्ति वृक्ष के बीच में, यह समस्या है। –

+0

यदि आप ToList को सम्मिलित नहीं करते हैं तो अपवाद क्या है? या एसक्यूएल सर्वर समस्या है? इस मामले में आप क्वेरी का पता लगा सकते हैं और इसे SQL सर्वर पर चलाने का प्रयास कर सकते हैं और देखें कि क्या होता है। – bubi

+0

यह 'प्रकार का अपवाद है' System.NotSupportedException 'EntityFramework.SqlServer.dll में हुआ लेकिन उपयोगकर्ता कोड अतिरिक्त जानकारी: LINQ से संस्थाएं' Int32 कुल [Int32] (System.Collections 'विधि को पहचान नहीं पाती हैं .Generic.IEumerable''1 [System.Int32], System.Func''3 [System.Int32, System.Int32, System.Int32]) 'विधि, और इस विधि को स्टोर अभिव्यक्ति में अनुवादित नहीं किया जा सकता है।' लिंक संस्थाओं को बस एसक्यूएल में कुल विधि का अनुवाद करने का तरीका नहीं पता है। –

0

हैरानी की बात है मौजूद नहीं करता है तो खेल

यह मौजूद है, तो आप SQL सर्वर और देखने जो LINQ समारोह के लिए एफई प्रदाता के स्रोत कोड देख सकते हैं से अधिक है कि में अनुवाद किया है या पूछना एक और सवाल , मैंने कल ठीक उसी स्थिति में भाग लिया है। तो, जैसा कि @bubi ने कहा है, SQL सर्वर के बिना उचित समग्र फ़ंक्शन यह संभव नहीं है

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

उदा। यदि उपयोगकर्ता के पास 0011 एनम मान है, तो आपको 0001 और 0010 झंडे दोनों के लिए बनाने या भविष्यवाणी करने की आवश्यकता होगी। 0001 ध्वज "या समूह"

x=> x.Equals(0001) || x.Equals(0011) || x.Equals(0101)| || ..) 

जैसा दिखता है लेकिन यह निश्चित रूप से अनुशंसित नहीं है।

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