2011-11-10 12 views
19

में स्ट्रिंग फ़ील्ड में एक पूर्णांक द्वारा ऑर्डर करने के लिए मेरे पास कुछ डीबी से बाहर आने वाला डेटा है जिसे मैं आसानी से स्कीमा नहीं बदल सकता। मैं इसे क्रमबद्ध करना चाहता हूं और इसे संख्यात्मक आईडी के आधार पर नियंत्रण में जोड़ना चाहता हूं। समस्या यह है कि एपीआई int और रूपांतरण प्रयास पर लिंक बारफ के बजाय स्ट्रिंग फ़ील्ड में संख्या संग्रहीत करता है।एक लिंक क्वेरी

myControl.DataSource = dataFromDB.OrderBy(o => int.Parse(o.StringHoldingAnInt)); 

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

Convert.ToInt32 या तो काम नहीं करता है।

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

स्ट्रिंग के रूप छंटाई उपयुक्त नहीं है, क्योंकि मानों सभी एक ही लंबाई नहीं हैं और यह इस तरह से उन्हें आदेश होगा: 1, 10, 11, 2, 3 ..

+0

वहाँ कितना डेटा है? क्या ग्राहक पक्ष को सॉर्ट करना संभव होगा? – dlev

+0

आप '0' के साथ स्ट्रिंग को पैड करने का प्रयास कर सकते हैं ताकि वे सभी एक ही लंबाई हो ... लेकिन मुझे यकीन नहीं है कि स्ट्रिंग.पैडलिफ्ट लिंक द्वारा समर्थित है। –

+0

डीडी में कई सौ पंक्तियां @ डीएलवी, जहां मेरे प्रश्न से छोड़ी गई थी() क्वेरी के बाद केवल कुछ दर्जन पंक्तियां। –

उत्तर

14

यह जीता ' टी लगभग उतना ही कुशल नहीं है क्योंकि आप अपने परिणामों को फ़िल्टर करने के लिए डेटाबेस क्वेरी का उपयोग नहीं कर रहे हैं, लेकिन यह मूल रूप से सभी डेटा के लिए क्वेरी करेगा, फिर क्लाइंट पर फ़िल्टर करें।

myControl.DataSource = dataFromDB.ToList().OrderBy(o => int.Parse(o.StringHoldingAnInt)); 
+0

मेरी अनब्रिज्ड क्वेरी एक उचित आकार में डेटा की मात्रा को कम करने के लिए कमांड द्वारा ऑर्डर से पहले कहां है (इसलिए क्लाइंट साइड प्रसंस्करण बोझ अत्यधिक नहीं होना चाहिए। –

1

आप एक सूची में क्वेरी परिवर्तित कर सकते हैं: यह परिवर्तित करके

var query = ...; 
var list = query.ToList(); 

अब आप मूल्यों से आदेश कर सकते हैं:

list.OrderBy(o => int.Parse(o.StringHoldingAnInt)); 

इस के साथ समस्या यह है कि आप को पुन: प्राप्त कर रहे हैं वे सभी मूल्य डेटाबेस से आते हैं और फिर आप स्मृति में ऑर्डर करते हैं।

+3

बस इतना कोई भी उलझन में नहीं है, 'ऑर्डरबै() 'एक' IENumerable' देता है। उपरोक्त 'list.OrderBy() 'पंक्ति वर्तमान में कुछ भी नहीं करेगी, क्योंकि आप' OrderBy() 'से एक चर में वापसी मान निर्दिष्ट नहीं कर रहे हैं। –

1

डीबी पक्ष पर ऐसा करना संभव है। विचार here से लिया गया है। तो यह ठीक से प्रारूपित स्ट्रिंग द्वारा छँटाई करता है (शून्य वर्ण बाईं ओर जोड़ रहे हैं और उसके बाद वर्ण की जरूरत राशि सही से लिया जाता है)

myControl.DataSource = dataFromDB 
    .OrderBy(o => DbFunctions.Right("00000" + o.StringHoldingAnInt, 7)); 
संबंधित मुद्दे