2010-09-23 17 views
15

मैं कुछ वास्तव में गतिशील पूछताछ करने की कोशिश कर रहा हूं - अधिमानतः रनटाइम पर कंपाइलर का आविष्कार किए बिना।एक स्ट्रिंग सी # LINQ अभिव्यक्ति

मेरे पास एक स्ट्रिंग है जिसमें LINQ अभिव्यक्ति है, उदा।

var s = "from a in queryable where a.Type == 1 select a"; 

मैं इसके परिणामस्वरूप IQueryable या अभिव्यक्ति कैसे प्राप्त कर सकता हूं?

मैंने LINQPad और RavenDb दोनों को यह देखा है इसलिए मुझे विश्वास है कि एक तरीका है, मुझे अभी तक यह नहीं मिला है।

उत्तर

20

आप कुछ विकल्प हैं:

  1. कुछ देसी करते हैं, पाठ पार्स करने और एक अभिव्यक्ति ट्री का निर्माण। इस के लिए मानक दृष्टिकोण स्ट्रिंग को पार्स करने के लिए एक भाषा पार्सर का उपयोग करना होगा (जैसे ANTLR)।

  2. क्वेरी संकलित करने के लिए कोडडॉम का उपयोग करें (उत्पादन वातावरण के लिए अनुशंसित नहीं है क्योंकि यह धीमा है और प्रति संकलन एक असेंबली उत्पन्न करता है जो आपके ऐपडोमेन को असेंबली के साथ संतृप्त करेगा यदि आप कई करते हैं। मुझे तनाव दें, इस मार्ग पर न जाएं यदि आप मात्रा के किसी भी प्रकार है - हालांकि यह है कि क्या LINQPad करता है) - http://social.msdn.microsoft.com/Forums/en-US/linqprojectgeneral/thread/6a4defd2-76f0-4865-97b7-130e4ba7b50a

  3. उपयोग मोनो संकलक जो MSIL सीधे (ताकि संकलन प्रति कोई विधानसभा और बहुत तेजी से) का उत्सर्जन करता है - Mono Compiler as a Service (MCS)

  4. उपयोग गतिशील LINQ (कुछ सीमाएं और प्रतिबंध हैं, लेकिन मूल रूप से करता है बिंदु # 1 में क्या सुझाव दिया गया है और यह अच्छा, हल्का वजन है, और इसमें केवल कुछ विधि कॉल की अनुमति देने की क्षमता है। यह पाठ क्वेरी पार्स करके उसे से एक अभिव्यक्ति ट्री बनाता है) - http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

+1

# 1 व्यावहारिक नहीं है। # 3 माइक्रोसॉफ्ट सीएलआर के तहत काम नहीं करता है (कोशिश की ...)। # 4 ठीक काम करता है लेकिन हाँ, यह सीमाओं के साथ आता है। –

+0

मैं # 3 कोशिश करने जा रहा हूं, मैंने थोड़ी देर पहले मिगुएल डी इकाज़ा के ब्लॉग पर एक पोस्ट पढ़ा था कि मोनो.एससीएचआरपी अब एमएस सीएलआर पर काम करता है। –

+2

संख्या 3 एमएस विंडोज सीएलआर के तहत काम करता है। इसे आजमाया और वर्तमान में उत्पादन में इसका इस्तेमाल किया। यदि यह आपको प्रस्ताव दे रहा है तो मेरी पोस्ट जांचें। केविन, यदि आप नंबर 3 के साथ जाते हैं तो सुनिश्चित करें कि आप मेरे पोस्ट में दिशानिर्देशों का पालन करते हैं या आप LINQ का उपयोग नहीं कर पाएंगे और आप कोडडॉम के रूप में प्रति संकलन समस्या के समान असेंबली के साथ समाप्त हो जाएंगे। – Jeff

0

कोड वस्तुओं हमेशा पार्स किसी प्रकार शामिल करने के लिए एक "जादू स्ट्रिंग" से जा रहे हैं। इस मामले में, EditableExpression लाइब्रेरी के साथ काम करना सबसे अच्छा हो सकता है (Google Code से निःशुल्क उपलब्ध)। अपनी स्ट्रिंग लें, और संपादन योग्य एक्सप्रेशन की श्रृंखला को क्रमबद्ध करने के परिणाम की तरह दिखने के लिए इसे प्रारूपित करें। फिर, बस इसे deserialize और एक अभिव्यक्ति पेड़ में परिवर्तित करें।

+0

क्यों वे नीचे वोट? –

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