2014-04-22 9 views
7

को नहीं पहचानता है मैं की तरह नीचेLINQ विधि 'Int32 indexOf (System.String, System.StringComparison)' विधि

GroupMaster getGroup = null; 
getGroup = DataContext.Groups.FirstOrDefault(item => keyword.IndexOf(item.Keywords,StringComparison.OrdinalIgnoreCase)>=0 && item.IsEnabled) 

Entityframework का उपयोग करते समय इस विधि मैं अपवाद मिला क्रियान्वित करते हुए एक LINQ क्वेरी निष्पादित की तरह नीचे

संस्थाओं को LINQ विधि 'Int32 indexOf (System.String, System.StringComparison)' विधि, नहीं पहचानता है और इस विधि एक दुकान अभिव्यक्ति में अनुवाद नहीं किया जा सकता है।

शामिल हैं() डिफ़ॉल्ट मामला तो फिर मैं वहाँ lower.Is के लिए एक स्ट्रिंग विधि शामिल है और वहाँ indexOf विधि इस मुद्दे को हल करने के लिए कोई भी तरीका है के अलावा अन्य मैच की जाँच के लिए कोई भी तरीका बदलने की आवश्यकता संवेदनशील द्वारा विधि?

+0

मैं अगर आप अपने 'DataContext.Groups' वस्तु के संबंधित क्षेत्रों का पर्दाफाश जवाब में सुधार हो सकता है। –

+4

'Contains' उत्पन्न SQL क्वेरी के भीतर' LIKE' बयान में तब्दील हो जाता। तथ्य यह है कि 'LIKE' केस संवेदनशील है या केस असंवेदनशील डेटाबेस कॉन्फ़िगरेशन पर निर्भर करता है। केस असंवेदनशील स्ट्रिंग तुलना करने के लिए अपना डेटाबेस बदलें और 'युक्त' का उपयोग करें। – MarcinJuraszek

+0

यह एक इकाई फ्रेमवर्क डेटाकॉन्टेक्स्ट है जहां समूह डीबीसेट JEMI

उत्तर

4

आप वास्तव में केवल यहाँ चार विकल्प हैं।

  1. वैश्विक स्तर पर डेटाबेस के संयोजन को बदलें। यह कई तरह से किया जा सकता है, एक सरल गूगल खोज उन्हें प्रकट करना चाहिए।
  2. व्यक्तिगत टेबल या स्तंभों का मिलान बदलें।
  3. संग्रहित प्रक्रिया का उपयोग करें और अपनी क्वेरी
  4. पर कोई प्रश्न पूछें और परिणामों का एक बड़ा सेट वापस करें, फिर लिंक से ऑब्जेक्ट्स का उपयोग करके स्मृति में फ़िल्टर करें।

संख्या 4 एक अच्छा विकल्प नहीं है जब तक कि आपका परिणाम सेट बहुत छोटा न हो। # 3 अच्छा है अगर आप डेटाबेस परिवर्तित नहीं कर सकता है (लेकिन आप इसके साथ Linq का उपयोग नहीं कर सकते हैं)।

संख्या 1 और 2 वे विकल्प हैं जिन्हें आपको संपूर्ण रूप से अपने डेटा मॉडल के बारे में बनाने की आवश्यकता है, या यदि आप इसे केवल विशिष्ट फ़ील्ड पर करना चाहते हैं।

सर्वर मिलान में बदलना: एक संग्रहीत proc में कोलेट बयान का उपयोग http://technet.microsoft.com/en-us/library/ms190920(v=sql.105).aspx

: http://technet.microsoft.com/en-us/library/ms179254.aspx

कॉलम मिलान में बदलना: http://technet.microsoft.com/en-us/library/ms184391.aspx

http://technet.microsoft.com/en-us/library/ms179254.aspx

डाटाबेस मिलान बदलने

3

इसके बजाय यदि आप इस विधि नीचे मामलों को कम करने के लिए उपयोग कर सकते हैं:

var lowerCaseItem = item.ToLower(); 

आपके आइटम प्रकार string की है। और यह आपको लगता है कि अपवाद के माध्यम से मिल सकता है।

+0

मैं इस समस्या को हल कर सकता हूं लेकिन कम करने के लिए फिर से ओवरलोड हो सकता है। string.indexof मैं मामले की जांच कर सकते हैं। मुझे लगता है कि – JEMI

+0

में शामिल हैं विधि के अलावा मैं उम्मीद कर रहा हूं, लेकिन मुझे लगता है कि आप गलत दिशा में जा रहे हैं। @ MarcinJuraszek की टिप्पणी चाल नहीं करेगा? इस समस्या को हल करने के अलावा –

+0

मेरा बड़ा संदेह अंदर है विधि में मुझे लगता है कि वे कार्यक्षमता की एक ही अनुक्रमणिका की जांच कर रहे हैं तो इकाईफ्रेमवर्क अपवाद क्यों फेंकता है? – JEMI

3

01 स्ट्रिंग वर्ग केविधि इकाई की रूपरेखा द्वारा मान्यता प्राप्त नहीं होगा, कृपया के साथ इस समारोह की जगह SQLfunction या Canonical functions

तुम भी here से मदद ले सकते या हो सकता है here

आप कोड नमूना नीचे का उपयोग कर सकते हैं:

DataContext .Groups.FirstOrDefault (मद => System.Data.Objects.SqlClient.SqlFunctions.CharIndex (item.Keywords, कीवर्ड) .Value> = 0 & & item.IsEnabled)

0

एरिक फंकनबश का जवाब डेटाबेस समस्या की तरह इसे देखते समय पूरी तरह मान्य है। लेकिन मुझे यह महसूस हो रहा है कि यदि आप उन्हें कुशलता से पार करना चाहते हैं तो आपको कीवर्ड के बारे में डेटा रखने के लिए बेहतर संरचना की आवश्यकता है।

ध्यान दें कि यह उत्तर बेहतर होने का इरादा नहीं है, इसका उद्देश्य पर्यावरण को वर्तमान में अनुकूलित करने के बजाय आपके डेटा मॉडल में समस्या को ठीक करना है (स्पष्ट रूप से त्रुटिपूर्ण, क्योंकि कोई समस्या है) डेटा मॉडल आपके पास।

मेरा मुख्य सुझाव, समय की बाधा के बावजूद (मुझे एहसास है कि यह सबसे आसान फिक्स नहीं है) कीवर्ड के लिए एक अलग तालिका जोड़ना होगा (इसके संबंधित वर्गों के साथ कई से अधिक संबंधों के साथ)।

[GROUPS] * ------- * [KEYWORD] 

यह आपको कीवर्ड के लिए खोज करने के लिए, और केवल तो आइटम नहीं हैं कि यह (एक यौगिक स्ट्रिंग आईडी बजाय के आधार पर) से संबंधित उस कीवर्ड को पुनः प्राप्त करने के लिए अनुमति चाहिए।

int? keywordID = DataContext.Keywords.Where(x => x.Name == keywordFilter).Select(x => x.Id).FirstOrDefault(); 

if(keywordID != null) 
{ 
    getGroup = DataContext.Groups.FirstOrDefault(group => group.Keywords.Any(kw => kw.Id == keywordID)); 
} 

लेकिन अगर मैं वर्तमान परियोजना में इस प्रकार का फ़िक्स संभव नहीं है तो मैं पूरी तरह से समझ सकता हूं। मैं, हालांकि यह उल्लेख करने के लिए इस प्रश्न पर भविष्य stumbles में मामला किसी में चाहते थे और अभी भी डेटा संरचना में सुधार के लिए विकल्प है।

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