मैं डॉटनेट कोर के लिए नया हूँ। मैं एक वेब एपीआई बना रहा हूं और यह लिंक। मेरे पास एक सॉर्टफिल्टर क्लास है जहां मुझे कॉलम और ऑर्डर प्राप्त होता है:

    public class SortFilter
{
    public string sortBy { get; set; } //Column name
    public string order { get; set; } //asc or desc
}

फिर सेवाओं में, मैं तदनुसार प्रतिक्रिया को क्रमबद्ध करने के लिए प्रदान की गई जानकारी का उपयोग करता हूं:

//Sort
        switch (sortFilter.sortBy)
        {
            case "name_ar":
                {
                    switch (sortFilter.order)
                    {
                        case "asc":
                            {
                                pagedData = pagedData.OrderBy(s => s.name_ar);
                                break;
                            }
                        case "desc":
                            {
                                pagedData = pagedData.OrderByDescending(s => s.name_ar);
                                break;
                            }
                        default:
                            {
                                pagedData = pagedData.OrderBy(s => s.name_ar);
                                break;
                            }
                    }
                    break;
                }

            case "name_en":
                {
                    switch (sortFilter.order)
                    {
                        case "asc":
                            {
                                pagedData = pagedData.OrderBy(s => s.name_en);
                                break;
                            }
                        case "desc":
                            {
                                pagedData = pagedData.OrderByDescending(s => s.name_en);
                                break;
                            }
                        default:
                            {
                                pagedData = pagedData.OrderBy(s => s.name_en);
                                break;
                            }
                    }
                    break;
                }

            case "description_ar":
                {
                    switch (sortFilter.order)
                    {
                        case "asc":
                            {
                                pagedData = pagedData.OrderBy(s => s.description_ar);
                                break;
                            }
                        case "desc":
                            {
                                pagedData = pagedData.OrderByDescending(s => s.description_ar);
                                break;
                            }
                        default:
                            {
                                pagedData = pagedData.OrderBy(s => s.description_ar);
                                break;
                            }
                    }
                    break;
                }

            case "description_en":
                {
                    switch (sortFilter.order)
                    {
                        case "asc":
                            {
                                pagedData = pagedData.OrderBy(s => s.description_en);
                                break;
                            }
                        case "desc":
                            {
                                pagedData = pagedData.OrderByDescending(s => s.description_en);
                                break;
                            }
                        default:
                            {
                                pagedData = pagedData.OrderBy(s => s.description_en);
                                break;
                            }
                    }
                    break;
                }

            case "orderNumber":
                {
                    switch (sortFilter.order)
                    {
                        case "asc":
                            {
                                pagedData = pagedData.OrderBy(s => s.orderNumber);
                                break;
                            }
                        case "desc":
                            {
                                pagedData = pagedData.OrderByDescending(s => s.orderNumber);
                                break;
                            }
                        default:
                            {
                                pagedData = pagedData.OrderBy(s => s.orderNumber);
                                break;
                            }
                    }
                    break;
                }


            case "id":
                {
                    switch (sortFilter.order)
                    {
                        case "asc":
                            {
                                pagedData = pagedData.OrderBy(s => s.id);
                                break;
                            }
                        case "desc":
                            {
                                pagedData = pagedData.OrderByDescending(s => s.id);
                                break;
                            }
                        default:
                            {
                                pagedData = pagedData.OrderBy(s => s.id);
                                break;
                            }
                    }
                    break;

                }

            default:
                pagedData = pagedData.OrderBy(s => s.id);
                break;
        }

मैं इस दृष्टिकोण के बारे में जो पसंद नहीं कर रहा हूं वह सभी सेवाओं में दोहराए जाने वाले कोड का यह बड़ा हिस्सा है, जो प्रत्येक संस्थाओं के कॉलम के लिए विशिष्ट है।

मैंने एक टेम्प्लेट सॉर्ट क्लास बनाने की कोशिश की, जहाँ मैं कुछ ऐसा कर सकता हूँ:

pagedData = pagedData.OrderBy(s => s[sortFilter.sortBy]) //using variable column name

लेकिन, इसकी अनुमति नहीं है। क्या कोई मुझे एक विकल्प सुझा सकता है?

1
Tayyab Mir 3 जिंदा 2021, 11:40

2 जवाब

सबसे बढ़िया उत्तर

यदि सॉर्टबी का मान फ़ील्ड नाम जैसा ही होगा तो आप प्रतिबिंब का उपयोग कर सकते हैं।

ऐसा करने पर एक और SO पोस्ट है: मैं कैसे निर्दिष्ट करूं? लिंक ऑर्डरबी तर्क गतिशील रूप से?

पिछले लिंक में कोड:

var param = "Address";    
var propertyInfo = typeof(Student).GetProperty(param);    
var orderByAddress = items.OrderBy(x => propertyInfo.GetValue(x, null));

आपको अपने प्रकारों से मेल खाने के लिए विद्यार्थी और परम फ़ील्ड को बदलना होगा।

1
Quintonn 3 जिंदा 2021, 15:00

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

https://khalidabuhakmeh.com/sort-data-with-aspnet-core-and-query-strings

सुनिश्चित करें कि आप इकाई परीक्षण लागू करते हैं यदि आप भविष्य के मुद्दों से बचने के लिए प्रतिबिंब का उपयोग कर रहे हैं! ;)

0
MathieuAuclair 3 जिंदा 2021, 14:52