Radenie IEnumerable v C# a Linq
Kategória: .NET, C#, publikované: 07.02.2010, autor: Igor Kulman
V článku o použití Repository Pattern v ASP.NET som popisoval metódu public static IEnumerable<Customer> GetList( string sortExpression, int startRowIndex, int maximumRows) na získanie zákazníkov, neuviedol som však jej implementáciu. Ak ovládate jazyk C#, určite vás napadlo, ako parametre startRowIndex a maximumRows využiť. Problém mohol nastať s parametrom sortExpression.
Uvažujme nasledujúcu implementáciu
/// <summary> /// Získa zoznam zákazníkov /// </summary> /// <param name="sortExpression">Stĺpec na triedenie</param> /// <param name="startRowIndex">Od záznamu</param> /// <param name="maximumRows">Počet záznamov</param> /// <returns></returns> public static IEnumerable<Customer> GetList(string sortExpression, int startRowIndex, int maximumRows) { return (from c in Db.customers where c.UserId == userId select new Customer { AccountNumber = c.AccountNumber, BankdId = c.BankId, City = c.City, Email = c.Email, Fax = c.Fax, Id = c.Id, IdNo = c.IdNo, Name = c.Name, Phone = c.Phone, UserId = c.UserId, VatNo = c.VatNo, Zip = c.Zip, Address = c.Address }).Sort(String.IsNullOrEmpty(sortExpression) ? "Id" : sortExpression).Skip(startRowIndex).Take(maximumRows).ToList(); }
Táto metóda vráti zoznam zákazníkov zoradený podľa property objektu Cstomer určenej pomocou sortExpression, prípadne podľa Id. Použitá metóda Sort<T>(this IEnumerable<T> source, string sortExpression) však nie je súčasťou jazyka, je potrebné ju implementovať.
public static class LinqExtensions { /// <summary> /// Zoradí SQL dopytu pomocou tetxovo zadaného parametra /// (z ObjectDataSource sortExpression) /// </summary> /// <typeparam name="T">Typ</typeparam> /// <param name="sortExpression">Výraz podle kterého sa radí</param> /// <returns></returns> public static IOrderedQueryable<T> Sort<T>(this IEnumerable<T> source, string sortExpression) { if (String.IsNullOrEmpty(sortExpression)) { // No sorting return (IOrderedQueryable<T>)source.AsQueryable<T>(); } IQueryable<T> qSource = source.AsQueryable<T>(); bool sortDescending = false; if (sortExpression.Contains("DESC")) { sortDescending = true; sortExpression = sortExpression.Replace("DESC", "").Trim(); } MemberExpression memberExpression = Expression.Property(param, sortExpression); { Expression<Func<T, int>> sortLambdaExpression = Expression.Lambda<Func<T, int>> return sortDescending ? qSource.OrderByDescending(sortLambdaExpression) : qSource.OrderBy(sortLambdaExpression); } { Expression<Func<T, int?>> sortLambdaExpression = Expression.Lambda<Func<T, int?>> return sortDescending ? qSource.OrderByDescending(sortLambdaExpression) : qSource.OrderBy(sortLambdaExpression); } { Expression<Func<T, bool>> sortLambdaExpression = Expression.Lambda<Func<T, bool>> return sortDescending ? qSource.OrderByDescending(sortLambdaExpression) : qSource.OrderBy(sortLambdaExpression); } { Expression<Func<T, bool?>> sortLambdaExpression = Expression.Lambda<Func<T, bool?>> return sortDescending ? qSource.OrderByDescending(sortLambdaExpression) : qSource.OrderBy(sortLambdaExpression); } { Expression<Func<T, float>> sortLambdaExpression = Expression.Lambda<Func<T, float>> return sortDescending ? qSource.OrderByDescending(sortLambdaExpression) : qSource.OrderBy(sortLambdaExpression); } { Expression<Func<T, float?>> sortLambdaExpression = Expression.Lambda<Func<T, float?>> return sortDescending ? qSource.OrderByDescending(sortLambdaExpression) : qSource.OrderBy(sortLambdaExpression); } { Expression<Func<T, string>> sortLambdaExpression = Expression.Lambda<Func<T, string>> return sortDescending ? qSource.OrderByDescending(sortLambdaExpression) : qSource.OrderBy(sortLambdaExpression); } { Expression<Func<T, DateTime>> sortLambdaExpression = Expression.Lambda<Func<T, DateTime>> return sortDescending ? qSource.OrderByDescending(sortLambdaExpression) : qSource.OrderBy(sortLambdaExpression); } { Expression<Func<T, DateTime?>> sortLambdaExpression = Expression.Lambda<Func<T, DateTime?>> return sortDescending ? qSource.OrderByDescending(sortLambdaExpression) : qSource.OrderBy(sortLambdaExpression); } else { Expression<Func<T, object>> sortLambdaExpression = Expression.Lambda<Func<T, object>> return sortDescending ? qSource.OrderByDescending(sortLambdaExpression) : qSource.OrderBy(sortLambdaExpression); } } }
Vďaka tejto triede teraz môžete využívať Repository Patter nazozaj naplno, aj s zoradovaním objektov ľubovoľného typu poďla ľubovoľného parametra.
ASP.NET a použitie Repository Pattern
Pri programovaní sa vždy snažím jednoduchý a ľahko pochopiteľný kód a upravovateľný kód, ak je to možné, použijem... čítať ďalej
Ako v C# vygynerovať MD5 hash
Vygenerovať MD5 hash v jazyku C# nie je také priamočiare, ako napríklad v PHP, ktoré obsahuje funkciu MD5(input). V... čítať ďalej
Pridať komentár
Autor
Autor je študentom informatiky na Univerzite Karlovej v Prahe, pracuje ako Solution Architect Assistant a pôsobil aj ako prispievateľ počítačového magazínu.

RSS komentárov




