2009-09-10 13 views
5

मैं एक पोस्टिंग जो एक एक सामान्य अभिव्यक्ति का उपयोग कर डेटा ऑर्डर करने के लिए अनुमति देता है में निम्नलिखित समारोह देखा या नाम स्थान का नाम "TKey 'नहीं पाया जा सका (यदि आप एक का उपयोग कर के निर्देश या एक विधानसभा संदर्भ याद कर रहे हैं?)" मैं यहाँ कुछ गूंगा कर रहा हूँ लेकिन मैं इसे समझ नहींसमस्या

संपादित करें:।।

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

मैं इस अब काम कर रहा है:

if (IsString) 
{ 
    Expression<Func<T, string>> expString = ...; 
    // call orderBy with expString 
} 
else if (IsInt) 
{ 
    Expression<Func<T, int>> expInt; 
    // call orderBy w/ expInt 
} 
: 

मैं की तरह कुछ हैं:

Expression<Func<T, {something generic!}>> exp; 
if (IsString) 
    exp = ...; 
else if (IsInt) 
    exp = ...; 
: 
// call orderBy with exp 
+0

यह ठीक लगता है। आप इस विधि का उपयोग कैसे कर रहे हैं? क्या आपने इसे स्थिर वर्ग में जोड़ा था? – BFree

उत्तर

2

इसमें मेरा लक्ष्य बहुत से दोहराव कोड को खत्म करना था। मेरे "ऑर्डरबी" फंक्शन को आरोही/अवरोही को संभालने के अलावा कुछ अन्य सामान्य तर्कों को अच्छी तरह से संभाला जाता है। मान लिया जाये कि मूल पोस्टिंग में समारोह परिभाषा, बस यह कर सकते हैं:

if ({need to sort by integer}) 
    query = OrderBy(objectT, a => a.myIntegerField, asc); 
else if ({need to sort by string}) 
    query = OrderBy(objectT, a=> a.myStringField, asc); 
: 
1

अभिव्यक्ति केवल एक ही प्रकार हो सकता है; मैं अपनी पसंदीदा जवाब यहाँ की तरह कुछ होगा:

IQueryable<T> query = ... 
if({case 1}) { 
    query = query.OrderBy(x=>x.SomeValue); 
} else if({case 2}) { 
    query = query.OrderBy(x=>x.SomeOtherValue); 
} ... 

हालांकि, अगर आप अधिक लचीला कुछ करना चाहता हूँ, तो आप शायद कस्टम Expression लेखन में प्राप्त करने की आवश्यकता होगी; कुछ more like this

+0

मैं मूल रूप से यही था, लेकिन इस तथ्य के कारण मैं "डुप्लीकेट" कोड के एक टन के साथ समाप्त हुआ क्योंकि मेरे पास कई फ़ील्ड हैं और आरोही/अवरोही प्रकारों को संभालने की आवश्यकता है। मेरे द्वारा पोस्ट किया गया जवाब अच्छी तरह से काम कर रहा है। – ejwipp

4

एक त्वरित अवलोकन: आप वास्तव में एक लैम्ब्डा अभिव्यक्ति (Expression<Func<T,TKey>>) का उपयोग करने की जरूरत नहीं है। एक साधारण प्रतिनिधि (Func<T,TKey>) ठीक है।

कहा, मुझे लगता है इस सवाल का जवाब आप के लिए देख रहा हो सकता है यह है:

Func<T,IComparable> func = null; 
if (IsString) 
    func = (T a) => a.SomeStringValue; 
else if (IsInt) 
    func = (T a) => a.SomeIntValue; 
// call orderBy with exp 
+0

ऐसा लगता है कि मैं क्या देख रहा था। हालांकि, मैंने इसके साथ थोड़ा सा खेला और इसे संकलित करने के लिए नहीं मिला। जब मैं ऑर्डरब्य फ़ंक्शन में func को पास करने का प्रयास करता हूं तो संकलक शिकायत करता है। यदि यह काम करेगा तो आपकी विधि थोड़ा क्लीनर होगी, लेकिन दुर्भाग्यवश मैं अभी इसके लिए और अधिक समय नहीं दे सकता। – ejwipp

+1

जब आपके पास समय है, तो कृपया मुझे बताएं कि आप क्या संकलक त्रुटि देख रहे हैं। – jpbochi

+0

मैं अंततः इसे वापस प्राप्त कर लिया है। मुझे लगता है कि समस्या यह है कि मेरे कस्टम ऑर्डर में, मैं फिर से कॉल करता हूं जो फंक तर्क नहीं लेता - इसे लैम्ब्डा अभिव्यक्ति की आवश्यकता होती है। – ejwipp

0

मुझे लगता है कि आप के लिए देख जा सकता है LINQ भीतर एक गतिशील orderby खंड करने की क्षमता है।विषय पर कुछ अच्छी लेख के लिए देखें

http://blogs.msdn.com/swiss_dpe_team/archive/2008/06/05/composable-linq-to-sql-query-with-dynamic-orderby.aspx

या

http://www.equivalence.co.uk/archives/819

या

http://www.rocksthoughts.com/blog/archive/2008/01/24/linq-to-sql-dynamic-queries.aspx

0

this answer

पर एक नजर डालें

छंटाई के लिए मेरे सामान्य हैंडलर है:

  • "dgvProcessList" मेरी DataGridView है
  • "प्रक्रिया" मेरे वस्तु इसे करने के लिए आबद्ध
  • "ई" है मेरी DataGridViewCellMouseEventArgs

      PropertyInfo column = (new Process()).GetType().GetProperties().Where(x => x.Name == dgvProcessList.Columns[e.ColumnIndex].Name).First(); 
         if (isSortedASC == true) 
          dgvProcessList.DataSource = ((List<Process>)dgvProcessList.DataSource).OrderByDescending(x => column.GetValue(x, null)).ToList(); 
         else 
          dgvProcessList.DataSource = ((List<Process>)dgvProcessList.DataSource).OrderBy(x => column.GetValue(x, null)).ToList(); 
    
         isSortedASC = !isSortedASC; 
         dgvProcessList.ClearSelection(); 
    
है

चीयर्स