2009-03-16 11 views
7

डेटाबेस में, मेरे पास संपर्क नामक एक टेबल है। पहला नाम और अन्य ऐसे स्ट्रिंग फ़ील्ड को चार डेटाटाइप (मेरा डेटाबेस डिज़ाइन नहीं) का उपयोग करने के लिए डिज़ाइन किया गया है। मेरी वस्तु गुणों में एक स्ट्रिंग प्रकार के लिए नक्शे से संपर्क करें। अगर मैं आईडी द्वारा एक संपर्क ऑब्जेक्ट पुन: प्राप्त करने के लिए एक साधारण परीक्षण करना चाहता था, मैं कुछ इस तरह करना होगा:लिंक से एसक्यूएल का उपयोग कर मूल्यों को कैसे ट्रिम करें?

Contact contact = db.Contacts.Single(c => c.Id == myId); 
Contact test = new Contact(); 
test.FirstName = "Martin"; 

Assert.AreEqual(test.FirstName, contact.FirstName); 

contact.FirstName मूल्य चार प्रकार की वजह से है "मार्टिन"। लोड होने पर फर्स्टनाम संपत्ति को मैं कहां से रोक सकता हूं? ऑन फर्स्टनाम चेंजिंग (स्ट्रिंग वैल्यू) प्रारंभिक लोड (संपर्क) पर नहीं बुलाया जाता है, लेकिन परीक्षण ऑब्जेक्ट पर करता है।

उत्तर

8

शायद आप इसे ऑनलोडेड() आंशिक विधि में डाल सकते हैं? नोट: मैंने कभी इसका उपयोग नहीं किया है, लेकिन मुझे लगता है कि यह इस तरह दिखेगा:

public partial class Contact 
{ 
    partial void OnLoaded() 
    { 
     FirstName = FirstName.Trim(); 
    } 
} 
+0

यह काम करता है। प्रत्येक क्षेत्र के लिए यह काफी आसान है क्योंकि मैं प्रदर्शन के लिए कई फ़ील्ड नहीं दिखा रहा हूं। धन्यवाद। – Marsharks

+0

यह एक संपत्ति परिवर्तित घटना उत्पन्न करने जा रहा है - जो अन्य कार्यों को ट्रिगर कर सकता है - और परिणामस्वरूप डेटाबेस में अनावश्यक अपडेट हो सकते हैं क्योंकि आप सामग्री में कोई अर्थपूर्ण परिवर्तन किए बिना संपत्ति के मूल्य को बदल रहे हैं। – tvanfosson

+3

प्रश्न का बिंदु इस तरह के तर्क करने के लिए जगह ढूंढना था (इस मामले में ऑनलोडेड()); विधि स्वयं ही आसानी से "_FirstName = _FirstName.Trim();" प्रोपरी से बचने के लिए घटना फायरिंग बदल दी। –

1
Contact contact = db.Contacts.Single(c => c.Id.Trim() == myId); 

और जांचें कि LINQ प्रदाता उचित एसक्यूएल में इसका अनुवाद करता है।

+0

मुझे नहीं लगता कि समस्या आईडी फ़ील्ड के साथ थी। – tvanfosson

+1

@tvanfosson - मुझे लगता है कि ओप केवल उदाहरण के लिए इसका इरादा रखता है, सचमुच नहीं लिया जाता है। –

6

यदि आप स्कीमा नहीं बदल सकते हैं, तो आप डिज़ाइनर को व्यक्तिगत/संरक्षित एक्सेसर को व्यक्तिगत/संरक्षित बना सकते हैं और आंशिक कक्षा कार्यान्वयन में संपत्ति के सामने के अंत तक सार्वजनिक एक्सेसर बनाना चाहते हैं। फिर आप एक्सेसर प्राप्त करने में मान को ट्रिम कर सकते हैं।

public partial class Contact 
{ 

    public string RealFirstName 
    { 
     get { return this.FirstName.Trim(); } 
     set { this.FirstName = value; } 
    } 

    ... 
} 
+1

यह एक अच्छा समाधान है, क्योंकि न केवल फ़ील्ड एक प्रकार का प्रकार है, उन्हें फर्स्ट_नाम भी कहा जाता है। तो मैं अपने ऑब्जेक्ट डिजाइनर में इसे बदले बिना, सभी फ़ील्ड को भी ठीक कर सकता था। – Marsharks

+0

समस्या तब होती है जब मैं कोई क्वेरी बनाता हूं और FullName = c.FirstName + '' + c.LastName जैसे कुछ का उपयोग करने का प्रयास करता हूं। मैं अभिव्यक्ति का अनुवाद नहीं कर सका और स्थानीय अभिव्यक्ति संदेश के रूप में इसका इलाज नहीं कर सका। – Marsharks

+0

एक बार जब आप अपना फ़िल्टरिंग कर लेंगे तो आप वास्तविक क्वेरी उत्पन्न करने के लिए ToList() का उपयोग कर सकते हैं, फिर परिणामी सूची में अपना चयन करें। चूंकि वे उस बिंदु पर ऑब्जेक्ट्स हैं, फुलनाम के निर्माण को काम करना चाहिए। – tvanfosson

0

आप मार्टिन के लिए खोज करने के लिए प्रयास करने से पहले अपने संपर्कों की सूची पर एक ForEach चला सकते हैं।

var contacts = db.Contacts.ForEach(c => c.FirstName = c.FirstName.Trim()); 
Contact contact = contacts.Single(c => c.Id == myId); 
contact.FirstName // = "Martin" 

लेकिन अगर इसे कई क्षेत्रों के लिए किया जाना है तो इस तरह बनाए रखना बहुत आसान नहीं है।

+0

क्या होता है यदि उसके पास 100,000 संपर्क हैं? –

1

यह स्कीमा और कोड पर आपके नियंत्रण पर निर्भर करता है।

यदि सभी पैरामीटर के साथ एक कन्स्ट्रक्टर को कॉल करके मूल्य स्थापित किए जा रहे हैं, तो trims, आदि करें क्योंकि वे सदस्य चर के लिए असाइन किए गए हैं।

यदि उन्हें गुणों (शायद उदाहरण से) के लिए असाइन किया जा रहा है, तो एसईटी एक्सेसर को बदलें ताकि यह वहां ट्रिम कर सके।

यदि आपके पास वास्तव में कुछ बिंदुओं पर अग्रणी या पिछली जगहों की इच्छा है तो आपके पास संभावित समस्याएं हैं।

यदि आप बेस क्लास कोड को संशोधित नहीं कर सकते हैं, तो आंशिक कक्षाओं का उपयोग करने की कोशिश करें, या कक्षा से विरासत में और वहां गुणों को ओवरराइड करें।

यदि आप ऐसा नहीं कर सकते हैं, तो मेरा आखिरी सुझाव किसी प्रकार की फैक्ट्री क्लास लिखना होगा जिससे आप किसी ऑब्जेक्ट को पास कर सकें और यह आपके इच्छित नियमों के अनुसार इसे साफ़ कर दे।

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