2008-09-22 16 views
14

गतिशील रूप से LINQ प्रश्नों और Lambda अभिव्यक्तियों को लिखने का सबसे अच्छा तरीका क्या है?गतिशील LINQ और गतिशील Lambda अभिव्यक्तियाँ?

मैं उन अनुप्रयोगों के बारे में सोच रहा हूं जहां अंतिम उपयोगकर्ता व्यवसाय तर्क नियम तैयार कर सकता है, जिसे तब निष्पादित किया जाना चाहिए।

मुझे खेद है कि यह एक नौसिखिया प्रश्न है, लेकिन अनुभव से सर्वोत्तम अभ्यास प्राप्त करना बहुत अच्छा होगा।

उत्तर

11

मैं बार्ट डी स्मेट (http://community.bartdesmet.net/blogs/bart/) की पोस्टिंग के माध्यम से पढ़ने की तुलना में अधिक अनुशंसा नहीं कर सकता, वह लैम्ब्डा की बात करते समय वास्तव में शानदार है।

उनकी हाल ही में श्रृंखला गतिशील लैम्ब्डा कवर, http://community.bartdesmet.net/blogs/bart/archive/2008/08/26/to-bind-or-not-to-bind-dynamic-expression-trees-part-0.aspx

बिल्कुल सुंदर कोड के साथ शुरू।

1

मैं दो तरीकों से देख सकता हूं कि आप गतिशील रूप से लैम्ब्डा उत्पन्न कर सकते हैं। आप प्रतिबिंबित करने का प्रयास कर सकते हैं। आईएल (नेट बाइटकोड) को सीधे उत्पन्न करने के लिए स्वीकार करें और उन्हें लैम्ब्डा के रूप में कॉल करें या आप उच्च स्तर की संरचनाओं से कोड उत्पन्न करने के लिए System.CodeDom और Microsoft.CSharp.CSharpCodeProvider का उपयोग कर सकते हैं। आप क्या करना चाहते हैं इस पर निर्भर करता है कि आप उपयोगकर्ता को यह सामान कैसे इनपुट करना चाहते हैं। यदि आप चाहते हैं कि उपयोगकर्ता सी # लिखना चाहता है तो आप केवल अंतर्निहित शिकायतकर्ता का उपयोग कर सकते हैं।

गतिशील रूप से लिंक उत्पन्न करना आसान होना चाहिए। आप LINQ क्वेरी को रनटाइम में अभिव्यक्ति पेड़ के रूप में उत्पन्न करने में सक्षम होना चाहिए और फिर उन्हें निष्पादित करने के लिए IQueryable में पास करना चाहिए। मैं सुझाव दूंगा कि आप इसके बारे में अधिक जानने के लिए IQueryable पर प्रलेखन देखें। एक और तरीका कुछ linq प्रश्नों को पूर्व परिभाषित करना होगा और फिर उपयोगकर्ता को उन्हें एक साथ श्रृंखलाबद्ध करने की अनुमति देगा। यह काम करने योग्य होना चाहिए क्योंकि कोई भी लिंक क्वेरी एक आईनेमरेबल लौटाती है जिसे अगली लिंक क्वेरी द्वारा खपत किया जा सकता है।

2

एक और संभावना है कि आप अपने प्रोग्राम में एक स्क्रिप्टिंग रनटाइम को एकीकृत करें, ताकि आपके उपयोगकर्ता एक डीएसएल में व्यवसाय तर्क लिख सकें। IronPython एक उम्मीदवार होगा।

+0

ध्वनि सलाह। हमने वर्कफ़्लो की कॉन्फ़िगरेशन के लिए ऐसा किया और यह काफी अच्छी तरह से काम करता है। –

+0

एकमात्र नकारात्मक पक्ष यह है कि आप पूर्ण/आंशिक ट्रस्ट वाले मुद्दों में भाग ले सकते हैं जो आपके कोड को एएसपीनेट – viggity

+0

में निष्पादित करने से रोक देगा, यह एक संभावना है, लेकिन यह मेरे प्रश्न का उत्तर नहीं है ... – Sklivvz

-1

मुझे समझ में नहीं आता कि आपका क्या मतलब है "सर्वश्रेष्ठ तरीका"। आप जो हासिल करना चाहते हैं उसका सरल उदाहरण प्रदान करना बेहतर होगा। गतिशील LINQ अभिव्यक्ति को संकलित करना मुश्किल नहीं है लेकिन मुश्किल है।

How do I compose existing Linq Expressions

+0

अकु, अगर यह मुश्किल है तो निश्चित रूप से सर्वोत्तम प्रथाएं हैं? – Sklivvz

+1

मुझे ऐसी चीजों के लिए "सर्वोत्तम अभ्यास" नहीं पता है। मुझे पता है कि ठोस समस्या को हल करने के लिए, लेकिन सामान्य "सबसे अच्छा तरीका" बहुत अस्पष्ट मामला है। – aku

0

लैम्ब्डा भाव आसानी से System.Linq.Expressions नाम स्थान के माध्यम से बनाया जा सकता है:

डायनामिक LINQ अभिव्यक्ति निर्माण का एक उदाहरण है।

0

System.Linq.Expressions आपको जो चाहिए वह है। मैंने एक अच्छा यूआई लिखा है जो उपयोगकर्ताओं को एक अभिव्यक्ति वृक्ष के रूप में गतिशील रूप से प्रश्नों को परिभाषित और निर्माण करने देता है। इसके बाद आप इसे Linq2SQL या अपनी पसंद के ग्राहक को सौंप सकते हैं।

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