2010-04-18 11 views
10

मैं एकरनटाइम पर टेक्स्ट से LINQ क्वेरी कैसे बनाएं?

class A { 
    public int X; 
    public double Y; 
    public string Z; 
    // and more fields/properties ... 
}; 

और एक List<A> data है और जैसे जैसे एक LINQ क्वेरी का निर्माण कर सकते

var q = from a in data where a.X > 20 select new {a.Y, a.Z}; 

फिर dataGridView1.DataSource = q.ToList(); प्रदर्शित करता है मेरी DataGridView में चयन।

अब प्रश्न, क्या उपयोगकर्ता द्वारा रनटाइम पर दर्ज किए गए पाठ से क्वेरी बनाना संभव है?

var q = QueryFromText("from a in data where a.X > 20 select new {a.Y, a.Z}"); 

बिंदु यह है कि उपयोगकर्ता (प्रोग्रामिंग कौशल वाले) गतिशील रूप से और स्वतंत्र रूप से प्रदर्शित डेटा का चयन कर सकते हैं।

उत्तर

4

ठीक है, आप निष्पादन समय पर कोड संकलित करने के लिए CSharpCodeProvider का उपयोग कर सकते हैं। इसके उदाहरण के लिए Snippy पर एक नज़र डालें। इस मामले में आपको उपयोगकर्ता कोड को उस विधि में संकलित करने की आवश्यकता होगी जो List<A> को data कहलाता है। मेरा अनुभव यह है कि यह काम करता है, लेकिन यह सही पाने के लिए थोड़ा सा मुश्किल हो सकता है - विशेष रूप से उपयुक्त संदर्भ आदि जोड़ने के संदर्भ में

+3

+1 लेकिन संकलन के बारे में चिंतित होगा और मनमाने ढंग से कोड निष्पादित। उचित परिश्रम की आवश्यकता होगी, और ऐसी चीज करने के बाद, मैं कहता हूं कि यह कोई मजेदार नहीं है और आपके सपनों का शिकार करेगा। ;-) –

5

Dynamic Linq बच्चे!

r.e. टिप्पणी।

हां, लिखित रूप में उदाहरण डायनेमिक लिंक का उपयोग करके संभव नहीं हो सकता है, लेकिन यदि आप स्थिरांक को कारक बनाते हैं, उदा। 'डेटा में से' आपको 'कहां' और 'चयन' के साथ छोड़ा जाता है जिसे गतिशील लिनक के साथ व्यक्त किया जा सकता है।

तो दो टेक्स्ट बॉक्स, शायद तीन अगर आप ऑर्डरबी शामिल करते हैं, तो संभवतः आपकी आवश्यकताओं को पूरा कर सकते हैं।

बस एक विचार।

जॉन के पास एक दिलचस्प दृष्टिकोण है लेकिन मैं अनियंत्रित कोड को संकलित और निष्पादित करने के लिए तैयार हूं।

+0

मुझे नहीं लगता कि डायनामिक लिंक के साथ यह कैसे संभव है। – Danvil

+0

@ डेनविल - आप सही हैं, लिखित के रूप में आपका उदाहरण संभव नहीं हो सकता है, लेकिन जब आप स्थिरांक जैसे कारक बनाते हैं ... आह नरक, मैं सिर्फ उत्तर संपादित करूँगा .. –

0

हालांकि ऐसा करने के कुछ तरीके हो सकते हैं, LINQ बस इस परिदृश्य के लिए डिज़ाइन नहीं किया गया है । कोडडॉम का उपयोग करना (जैसा कि जॉन ने सुझाव दिया है) शायद यह आसानी से करने का एकमात्र तरीका है। यदि आप उपयोगकर्ता पर भरोसा करते हैं और उसके पास प्रोग्रामिंग कौशल है, तो आप शायद पुराने तरीके से उपयोग कर सकते हैं और उपयोगकर्ता को SQL का उपयोग करके क्वेरी दर्ज कर सकते हैं?

यदि आप दूसरी तरफ, प्रश्नों के निर्माण के लिए कुछ दृश्य उपकरण बनाना चुनते हैं, तो आपको स्ट्रिंग लिखकर उन्हें बनाने की आवश्यकता नहीं है और आप इसके बजाय अभिव्यक्ति पेड़ लिख सकते हैं। उदाहरण के लिए Linq Kit और AsExpandable का उपयोग करना।

+0

मेरे पास डेटा के रूप में डेटा है और डेटाबेस में नहीं। हालांकि मैं LINQ का उपयोग करके, शायद कक्षाओं पर समान इंटरैक्टिव queriying व्यवहार प्राप्त कर सकते हैं - जैसे SQL क्वेरी डेटाबेस पर कर सकते हैं। – Danvil

1

यह बहुत देर से उत्तर देना; हालांकि, यह इस पृष्ठ पर आने वाले किसी व्यक्ति की सहायता करेगा।

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

कोड इसलिए यहाँ बहुत लंबा है GitHub पर github link

नमूना आवेदन प्रक्षेपण सहित कई उदाहरण से पता चलता है।

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