ऐसा लगता है कि लिंक से इकाइयां Aggregate
विधि का समर्थन नहीं करती हैं। मुझे इस संदेश को .Select(a => a.Permissions).Aggregate((a, b) => a | b)
को बड़ी अभिव्यक्ति के हिस्से को फिर से लिखना होगा जो कि लिंक से इकाइयों को समझता है। क्या यह संभव है?इकाइयों से लिंक कुल विधि प्रतिस्थापन
शायद मुझे आपको क्या करना है इसके बारे में बेहतर स्पष्टीकरण देना चाहिए। मुझे इन आयोजकों को उपयोगकर्ता अनुमतियों के आधार पर डेटाबेस से आयोजकों का संग्रह प्राप्त करने की आवश्यकता है। अनुमतियां बिट झंडे के रूप में जमा है और निम्न में से संयोजन कर रहे हैं:
- DefaultOrganizerPermissions - हर आयोजक कुछ डिफ़ॉल्ट अनुमतियां है
- OwnerPermissions - यदि उपयोगकर्ता आयोजक का स्वामी है, वह कुछ अतिरिक्त अनुमति है
- उपयोगकर्ता प्रसंस्करण - उपयोगकर्ताओं को मैन्युअल रूप से ऑर्गनाइज़र
- रोलप्रमिशन - उपयोगकर्ता भूमिकाओं के सदस्य हो सकते हैं और इन भूमिकाओं को आयोजकों को अतिरिक्त अनुमतियां दी जा सकती हैं।
तो मैं निम्नलिखित हस्ताक्षर
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);
समस्या यह है कि उपयोगकर्ता एकाधिक भूमिकाओं का सदस्य हो सकता है, इसलिए रोलप्रमिशन वास्तव में कई अनुमतियां हैं और मुझे इसे बिटवाई के साथ फ़्लैट करना होगा या। लेकिन कैसे, अगर कुल समर्थित नहीं है?
मैंने पहले यह कोशिश की है, लेकिन इसका कोई प्रभाव नहीं है। –
क्या आपने इसे आजमाया? .... ToList()। चुनें (ए => ए। पैरामिशन) .ग्रेगेट ((ए, बी) => ए | बी) ToList() क्वेरी को पूरा करता है (इसलिए बुरा है) लेकिन यह काम करना चाहिए ... आप अन्य तरीकों, यानी योग या सही है जो केवल सही है (FirstOrDefault) लेकिन आपको और अधिक स्पष्ट होना चाहिए। – bubi
@bubi हां, मैंने किया। मैं एक ही कक्षा में एक और विधि में ToList() का उपयोग कर रहा हूं और यह काम करता है। लेकिन यह इस में काम नहीं करता है। मुझे लगता है कि यह अजीब बात है, मैं उम्मीद करता हूं कि यह या तो काम करे, या कुछ (अलग) त्रुटि उठाए, लेकिन इसमें कोई बदलाव नहीं है। मुझे बस किसी भी तरह से कई बिट झंडे मर्ज करना चाहिए (उन्हें पूर्णांक के रूप में दर्शाया जाता है), उदाहरण के लिए 1010 | 0011 = 1011. मुझे नहीं पता कि यह Sum के साथ संभव है या नहीं। –