2013-01-19 21 views
7

में स्ट्रिंग प्रसंस्करण मैं अपनी तालिका में एक स्तंभ जोLinq में Regex (EntityFramework), डेटाबेस

"FilterA:123,234,34;FilterB:12,23;FilterC:;FilterD:45;" 

फिल्टर से अलग होते हैं के रूप में मान शामिल है ';' और प्रत्येक फ़िल्टर के मान ',' से अलग होते हैं। फ़िल्टर के नाम और उसके मानों के बीच एक ':' है।

अब, क्या मैं कुछ भी कर सकता हूं जो मूल्यों को केवल भाग ले सकता है? "फ़िल्टरए" के लिए "123,234,34" की तरह। या क्या मैं इसे "फ़िल्टरबी" के मूल्य भाग में "फ़िल्टरए" और/या "54" के मान भाग में खोजने के लिए "234" की तरह एक नंबर दे सकता हूं? मुझे पता है कि रेगेक्स का उपयोग करना संभव है, मुझे लगता है, लेकिन मुझे नहीं पता कि कैसे।

+0

साथ स्थानीय रूप से विश्लेषण किया जा सकता करने के लिए नीचे सेट फिल्टर करने के लिए SqlMethods.Like का उपयोग कर सकता है, तो आप कुछ पंक्तियों ढूंढना चाहते हैं किसी फ़िल्टर के मान के आधार पर या क्या आप कुछ पहले से चुनी गई पंक्तियों से फ़िल्टर मान निकालना चाहते हैं? – SDReyes

+0

मैं फ़िल्टर स्ट्रिंग –

उत्तर

11

आप लिंक से संस्थाओं के प्रश्नों में नियमित अभिव्यक्तियों का उपयोग नहीं कर सकते हैं, क्योंकि इन्हें एसक्यूएल में अनुवादित नहीं किया जा सकता है। ; द्वारा अपने फ़िल्टर को विभाजित करने के लिए आप String.Split का भी उपयोग नहीं कर सकते हैं। आपके पास यहां दो विकल्प हैं:

  • डेटाबेस तालिका संरचना बदलें। जैसे तालिका Foo_Filter बनाएं जो आपकी इकाइयों को फ़िल्टर से लिंक करेगी। और फिर तालिका Filters बनाएं जिसमें फ़िल्टर डेटा होगा।
  • स्मृति में क्वेरी निष्पादित करें और ऑब्जेक्ट्स के लिए लिंक का उपयोग करें। यह विकल्प धीमी गति से हो जाएगा, क्योंकि आप @lazyberezovsky के लिए स्मृति
+0

में डेटा के साथ अपने डेटा की तुलना में कुछ पंक्तियों का चयन करना चाहता हूं "स्मृति में क्वेरी निष्पादित करें और ऑब्जेक्ट्स के लिए लिंक का उपयोग करें। यह विकल्प धीमा हो जाएगा, क्योंकि आपको डेटाबेस से सभी डेटा को मेमोरी में लाने के लिए" यह है मैं बचने की कोशिश कर रहा हूँ! –

+1

@TahaRehmanSiddiqui तो आपके लिए केवल पहला विकल्प छोड़ा गया। लिंक से एंटिटीज़ के साथ स्ट्रिंग से फ़िल्टरए डेटा लाने का कोई तरीका नहीं है –

0

+1 करने के लिए डेटाबेस से सभी डेटा लाने के लिए है, तो आप संस्थाओं के लिए LINQ में regex ऐसा नहीं कर सकते क्योंकि यह है कि अनुवाद नहीं कर सकता SQL में। आप सभी रिकॉर्ड्स को मेमोरी में वापस खींच सकते हैं, फिर लिंक पर ऑब्जेक्ट्स करें (.ToList() एक वैरिएबल पर करें, फिर इस रेगेक्स के लिए दूसरी लिनक्स क्वेरी करें) लेकिन इसका मतलब है कि आप इस क्वेरी को संसाधित करने के लिए स्मृति में प्रत्येक डीबी रिकॉर्ड लोड करेंगे। वही सिफारिशें: डीबी संरचना को बदलें जैसे कि आपको ऐसा करने की आवश्यकता नहीं है।

0

मुझे लगता है कि यदि आप डेटाबेस सर्वर पर सबकुछ निष्पादित करना चाहते हैं तो आपको एक SQL फ़ंक्शन की आवश्यकता होगी जो इन फ़िल्टरों को पार्स कर सकता है, शायद एक बहु-कॉलम तालिका लौटा सकता है। दुर्भाग्य से मैं एक मशीन पर नहीं हूं जहां मैं कोई नमूना कोड प्रदान कर सकता हूं।

2

आपके मौलिक डेटाबेस प्रदाता एसक्यूएल सर्वर तो आप डेटाबेस परिणाम डेटा की एक प्रबंधनीय सबसेट है कि तब रेगुलर एक्सप्रेशन से