2009-02-12 23 views
7

मुझे एक एक्सटेंशन विधि मिली है जो LINQ के लिए सॉर्टिंग और पेजिंग को संभालती है। हालांकि यह अच्छी तरह से काम करता है, मैं यह देखने की कोशिश कर रहा हूं कि कुछ अन्य तरीकों से मैं इसका उपयोग कर सकता हूं या नहीं।सॉर्टिंग और पेजिंग के लिए LINQ से SQL एक्सटेंशन विधि

public static IQueryable<T> Page<T, TResult>(
    this IQueryable<T> obj, 
    int page, 
    int pageSize, 
    System.Linq.Expressions.Expression<Func<T, TResult>> keySelector, 
    bool asc, 
    out int rowsCount) 
{ 
    rowsCount = obj.Count(); 

    int innerRows = (page - 1) * pageSize; 

    if (asc) 
     return obj.OrderBy(keySelector).Skip(innerRows).Take(pageSize).AsQueryable(); 
    else 
     return obj.OrderByDescending(keySelector).Skip(innerRows).Take(pageSize).AsQueryable(); 
} 

विधि एक अभिव्यक्ति है, जो बंद प्रकार आधारित है में लेता है:

वर्तमान में, extension method के लिए कोड इस प्रकार है।

मेरी डीलर वर्ग में, मैं एक विधि GetDealers है, जो अनिवार्य रूप से इस कॉल, अर्थात

db.User.Page(1, 2, p => p.User.UserProperty.Name, true, out rowCount) 

हालांकि चीजों की प्रस्तुति की ओर से मैं नहीं जानता या जैसे के रूप में ऊपर अभिव्यक्ति का उपयोग कर सकते,

ListView1.DataSource = users.GetDealers("SortColumn", pageNo, pageSize, out rowCount, bool asc); 
ListView1.DataBind(); 

एकमात्र तरीका है कि मेरे GetDealers विधि में स्विच स्टेटमेंट होना है जो अभिव्यक्ति में परिवर्तित हो जाएगा। क्या इसे बाईपास करने का कोई तरीका है, या यह विधि ठीक है?

उत्तर

5

मुझे बिल्कुल यकीन नहीं है कि आप क्या पूछ रहे हैं, लेकिन मेरा मानना ​​है कि यह ऐसा कुछ है जिसे मैंने स्वयं में देखा है। यदि आप जानना चाहते हैं कि एक उचित LINQ अभिव्यक्ति के बजाय स्ट्रिंग के आधार पर अपने परिणामों को गतिशील रूप से कैसे क्रमबद्ध करें, तो आप भाग्यशाली हैं।

स्कॉट गुथरी ने उस विषय पर एक महान article प्रकाशित किया। यह एक माइक्रोसॉफ्ट फ़ाइल का संदर्भ देता है जो डायनामिक सॉर्टिंग का समर्थन करने के लिए IQueryable ऑब्जेक्ट बढ़ाता है। C# Dynamic Query Library (included in the \LinqSamples\DynamicQuery directory)। बस अपने App_Code फ़ोल्डर में पेज जोड़ने के लिए और शामिल अपनी परियोजना में "System.Linq.Dynamic का उपयोग करना" और आप निम्नलिखित सिंटैक्स का उपयोग करने में सक्षम हो जाएगा:

myUsers = myUsers.OrderBy("LastName"); 

मुझे आशा है कि इस मदद करता है!

0

आप सभी प्रकार पर काम करने के लिए विस्तार विधि के लिए देख रहे हैं

public static class SortingAndPagingHelper 
{ 
    /// <summary> 
    /// Returns the list of items of type on which method called 
    /// </summary> 
    /// <typeparam name="TSource">This helper can be invoked on IEnumerable type.</typeparam> 
    /// <param name="source">instance on which this helper is invoked.</param> 
    /// <param name="sortingModal">Page no</param> 
    /// <returns>List of items after query being executed on</returns> 
    public static IEnumerable<TSource> SortingAndPaging<TSource>(this IEnumerable<TSource> source, SortingAndPagingInfo sortingModal) 
    { 
     // Gets the coloumn name that sorting to be done o`enter code here`n 
     PropertyInfo propertyInfo = source.GetType().GetGenericArguments()[0].GetProperty(sortingModal.SortColumnName); 

     // sorts by ascending if sort criteria is Ascending otherwise sorts descending 
     return sortingModal.SortOrder == "Ascending" ? source.OrderByDescending(x => propertyInfo.GetValue(x, null)).Skip(sortingModal.PageSelected * sortingModal.PageSize).Take(sortingModal.PageSize) 
          : source.OrderBy(x => propertyInfo.GetValue(x, null)).Skip(sortingModal.PageSelected * sortingModal.PageSize).Take(sortingModal.PageSize); 
    } 
} 

DbContext dbContext = new DbContext(); dbContext.rainingSessions.Where(x => x.RegistrationDeadline > DateTime.Now) .SortingAndPaging(sortAndPagingInfo).ToList()

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