2011-03-23 7 views
10

किसी क्वेरी में LINQ स्ट्रिंग को पार्स करने के लिए सर्वोत्तम विधि माना जाएगा?पार्स स्ट्रिंग को LINQ क्वेरी

या दूसरे शब्दों में, क्या दृष्टिकोण सबसे अधिक उपयुक्त कन्वर्ट करने के लिए बनाता है:

string query = @"from element in source 
        where element.Property = ""param"" 
        select element"; 

में
IEnumerable<Element> = from element in source 
         where element.Property = "param" 
         select element; 

यह सोचते हैं कि source स्थानीय दायरे में एक IEnumerable<Element> या IQueryable<Element> को दर्शाता है।

+0

दुर्भाग्यवश, यह कठिन होगा। मुझे उम्मीद है कि कोई मुझे आश्चर्यचकित करता है और मुझे गलत साबित करता है, लेकिन मुझे उम्मीद नहीं है कि ऐसा होने की उम्मीद है। – Jon

+2

बिल्कुल आपके प्रश्न का उत्तर नहीं देता है लेकिन बहुत करीब है http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library .aspx –

+2

लगता है कि www.linqpad.net क्या करेगा ... लेकिन मुझे नहीं पता कि वे इसे कैसे करते हैं। –

उत्तर

0

हालांकि यह विशेष रूप से मैं सोचा होगा सबसे अच्छा अभ्यास आम तौर पर स्ट्रिंग से एक अभिव्यक्ति पेड़ के निर्माण के लिए किया जाएगा आपके सवाल का जवाब देने के लिए एक उदाहरण नहीं देता है।

this प्रश्न में मैंने पूछा कि एक स्ट्रिंग के साथ एक linq क्वेरी को फ़िल्टर करने के तरीके से पूछा गया है जो आपको एक अभिव्यक्ति वृक्ष का एक हिस्सा बना रहा है। हालांकि इस अवधारणा को आपकी स्ट्रिंग का प्रतिनिधित्व करने वाला एक संपूर्ण अभिव्यक्ति वृक्ष बनाने के लिए बढ़ाया जा सकता है।

इस आलेख को Microsoft से देखें।

वहां शायद अन्य बेहतर पोस्ट भी हैं। इसके अतिरिक्त मुझे लगता है कि RavenDB जैसे कुछ ऐसा पहले से ही इंडेक्स को परिभाषित करने के लिए कोड कोड में हैं।

4

इसमें कुछ टेक्स्ट पार्सिंग और System.Linq.Expressions का भारी उपयोग की आवश्यकता है। मैंने कुछ here और here के साथ कुछ किया है। दूसरे लेख में कोड कुछ हद तक अद्यतन किया गया है लेकिन अभी भी धब्बे में मोटा है। मैंने अवसर पर इस के साथ गड़बड़ी जारी रखी है और कुछ हद तक क्लीनर संस्करण है जिसका अर्थ है कि अगर आपको कोई रूचि है तो पोस्ट करने का मतलब है। मुझे एएनएसआई एसक्यूएल 89 के अच्छे सबसेट का समर्थन करने के बहुत करीब मिल गया है।

2

आपको सी # भाषा पार्सर की आवश्यकता होगी (कम से कम v3.5, संभवतः v4.0, सी # भाषा सुविधाओं के आधार पर आपको LINQ में समर्थन करना चाहते हैं)। आप उन पार्सर परिणामों को ले लेंगे और विज़िटर पैटर्न का उपयोग करके इसे अभिव्यक्ति पेड़ में सीधे फ़ीड करेंगे। मुझे अभी तक यकीन नहीं है लेकिन मैं शर्त लगाने के लिए तैयार हूं कि अभिव्यक्ति नोड्स को पूरी तरह से उत्पन्न करने के लिए आपको कुछ प्रकार के प्रकार के विश्लेषण की भी आवश्यकता होगी।

मैं आपके जैसा ही सामान ढूंढ रहा हूं, लेकिन मुझे वास्तव में इसकी आवश्यकता नहीं है कि बुरी तरह से मैंने कठोर खोज नहीं की है और न ही इन पंक्तियों के साथ कोई कोड लिखा है।

मैंने कुछ लिखा है जो उपयोगकर्ता स्ट्रिंग इनपुट लेता है और इसे Microsoft.CSharp.CSharpCodeProvider कंपाइलर प्रदाता कक्षा का उपयोग करके गतिशील असेंबली में संकलित करता है। यदि आप केवल कोड के तार लेना चाहते हैं और परिणाम निष्पादित करना चाहते हैं, तो यह आपको ठीक से अनुरूप होना चाहिए।

यहाँ कंसोल उपकरण मैंने लिखा का वर्णन है, LinqFilter:

http://bittwiddlers.org/?p=141

यहाँ स्रोत भंडार है। LinqFilter/Program.cs दर्शाता है कि कैसे LINQ अभिव्यक्ति संकलित करने के लिए संकलक उपयोग करने के लिए:

http://bittwiddlers.org/viewsvn/trunk/public/LinqFilter/?root=WellDunne

+0

एक विचार होता है: यदि आप एक अभिव्यक्ति होने वाली स्ट्रिंग के बारे में पागल थे, तो आप 'CSharpCodeProvider' का उपयोग कर सकते हैं और' अभिव्यक्ति > क्वेरी = (LINQ कोड यहां) के साथ कोड उत्पन्न कर सकते हैं; और फिर आप आपके पास संकलक द्वारा आपके लिए बनाया गया अभिव्यक्ति वृक्ष होगा। यह निष्पादित करने के लिए एक प्रतिनिधि को वापस लाने के लिए 'कंपाइल()' कॉल का मामला है और आपको उत्पन्न गतिशील असेंबली की विधि खोजने के लिए कुछ प्रतिबिंब है ताकि आप इसे निष्पादित कर सकें। उम्मीद है कि यह समझ में आता है; मैं यहाँ lolling तरह की तरह हूँ। :) –

+0

मुझे माफ़ कर दो, इसे 'अभिव्यक्ति >>' या 'अभिव्यक्ति >>' होना चाहिए। आपके जेनरेट कोड में, आप सुरक्षित रूप से निम्नानुसार संयोजित कर सकते हैं: 'अभिव्यक्ति >> getQuery =() => (यहां linq क्वेरी);' कंपाइलर केवल मान्य अभिव्यक्ति स्वीकार करेगा जिसे अभिव्यक्ति वृक्ष में पार्स किया जा सकता है। सी # v3.5 के लिए, इसमें बयान और असाइनमेंट एक्सप्रेशन शामिल नहीं हैं। –

+0

क्वेरी निष्पादित करने के लिए, 'getQuery' ले लो और getQuery.Compile()() 'करें। दो कोष्ठक जोड़े यहां कोई गलती नहीं हैं। आप 'कंपाइल()' विधि का आह्वान करते हैं जो आपको एक प्रतिनिधि को वापस देता है और आप उस प्रतिनिधि को आमंत्रित करते हैं जो आपको वापस 'IQueryable ' या जो भी IQueryable/IEnumerable प्रकार देता है, जिसे आप वापस उम्मीद करते हैं। –

1

यह या आपकी मदद नहीं कर सकते हैं सकता है, लेकिन LINQ Dynamic Query Library की जाँच करें।

1

नेट 4.6 के साथ शुरू आप भी Linq पार्स करने के लिए CSharpScript उपयोग कर सकते हैं, अभिव्यक्ति आप पार्स करने के लिए क्वेरी में है चाहता हूँ यह सोचते हैं, यह यह करना होगा:

string query = "from element in source where element.Property = ""param"" select element"; 
IEnumerable result = null; 
try 
{ 
    var scriptOptions = ScriptOptions.Default.WithReferences(typeof(System.Linq.Enumerable).Assembly).WithImports("System.Linq"); 
    result = await CSharpScript.EvaluateAsync<IEnumerable>(
      query, 
      scriptOptions, 
      globals: global); 
} catch (CompilationErrorException ex) { 
// 
} 

मत भूलना अपने (डेटा पारित करने के लिए) स्रोत जिसे आप काम करना चाहते हैं, ग्लोबल-चर के साथ स्क्रिप्ट से उन्हें एक्सेस करने के लिए।