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

  1. /// <summary>
  2. /// Získa zoznam zákazníkov
  3. /// </summary>
  4. /// <param name="sortExpression">Stĺpec na triedenie</param>
  5. /// <param name="startRowIndex">Od záznamu</param>
  6. /// <param name="maximumRows">Počet záznamov</param>
  7. /// <returns></returns>
  8. public static IEnumerable<Customer> GetList(string sortExpression, int startRowIndex, int maximumRows)
  9. {
  10.  
  11. return (from c in Db.customers
  12. where c.UserId == userId
  13. select new Customer
  14. {
  15. AccountNumber = c.AccountNumber,
  16. BankdId = c.BankId,
  17. City = c.City,
  18. Email = c.Email,
  19. Fax = c.Fax,
  20. Id = c.Id,
  21. IdNo = c.IdNo,
  22. Name = c.Name,
  23. Phone = c.Phone,
  24. UserId = c.UserId,
  25. VatNo = c.VatNo,
  26. Zip = c.Zip,
  27. Address = c.Address
  28. }).Sort(String.IsNullOrEmpty(sortExpression) ? "Id" : sortExpression).Skip(startRowIndex).Take(maximumRows).ToList();
  29.  
  30. }

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ť.

  1. public static class LinqExtensions
  2. {
  3. /// <summary>
  4. /// Zoradí SQL dopytu pomocou tetxovo zadaného parametra
  5. /// (z ObjectDataSource sortExpression)
  6. /// </summary>
  7. /// <typeparam name="T">Typ</typeparam>
  8. /// <param name="sortExpression">Výraz podle kterého sa radí</param>
  9. /// <returns></returns>
  10. public static IOrderedQueryable<T> Sort<T>(this IEnumerable<T> source, string sortExpression)
  11. {
  12. if (String.IsNullOrEmpty(sortExpression))
  13. {
  14. // No sorting
  15. return (IOrderedQueryable<T>)source.AsQueryable<T>();
  16. }
  17.  
  18. IQueryable<T> qSource = source.AsQueryable<T>();
  19.  
  20. bool sortDescending = false;
  21. if (sortExpression.Contains("DESC"))
  22. {
  23. sortDescending = true;
  24. sortExpression = sortExpression.Replace("DESC", "").Trim();
  25. }
  26.  
  27. ParameterExpression param = Expression.Parameter(typeof(T), "item");
  28. MemberExpression memberExpression = Expression.Property(param, sortExpression);
  29.  
  30. if (memberExpression.Type == typeof(int))
  31. {
  32. Expression<Func<T, int>> sortLambdaExpression = Expression.Lambda<Func<T, int>>
  33. (Expression.Convert(memberExpression, typeof(int)), param);
  34.  
  35. return sortDescending ? qSource.OrderByDescending(sortLambdaExpression) : qSource.OrderBy(sortLambdaExpression);
  36. }
  37. else if (memberExpression.Type == typeof(int?))
  38. {
  39. Expression<Func<T, int?>> sortLambdaExpression = Expression.Lambda<Func<T, int?>>
  40. (Expression.Convert(memberExpression, typeof(int?)), param);
  41.  
  42. return sortDescending ? qSource.OrderByDescending(sortLambdaExpression) : qSource.OrderBy(sortLambdaExpression);
  43. }
  44. else if (memberExpression.Type == typeof(bool))
  45. {
  46. Expression<Func<T, bool>> sortLambdaExpression = Expression.Lambda<Func<T, bool>>
  47. (Expression.Convert(memberExpression, typeof(bool)), param);
  48.  
  49. return sortDescending ? qSource.OrderByDescending(sortLambdaExpression) : qSource.OrderBy(sortLambdaExpression);
  50. }
  51. else if (memberExpression.Type == typeof(bool?))
  52. {
  53. Expression<Func<T, bool?>> sortLambdaExpression = Expression.Lambda<Func<T, bool?>>
  54. (Expression.Convert(memberExpression, typeof(bool?)), param);
  55.  
  56. return sortDescending ? qSource.OrderByDescending(sortLambdaExpression) : qSource.OrderBy(sortLambdaExpression);
  57. }
  58. else if (memberExpression.Type == typeof(float))
  59. {
  60. Expression<Func<T, float>> sortLambdaExpression = Expression.Lambda<Func<T, float>>
  61. (Expression.Convert(memberExpression, typeof(float)), param);
  62.  
  63. return sortDescending ? qSource.OrderByDescending(sortLambdaExpression) : qSource.OrderBy(sortLambdaExpression);
  64. }
  65. else if (memberExpression.Type == typeof(float?))
  66. {
  67. Expression<Func<T, float?>> sortLambdaExpression = Expression.Lambda<Func<T, float?>>
  68. (Expression.Convert(memberExpression, typeof(float?)), param);
  69.  
  70. return sortDescending ? qSource.OrderByDescending(sortLambdaExpression) : qSource.OrderBy(sortLambdaExpression);
  71. }
  72. else if (memberExpression.Type == typeof(string))
  73. {
  74. Expression<Func<T, string>> sortLambdaExpression = Expression.Lambda<Func<T, string>>
  75. (Expression.Convert(memberExpression, typeof(string)), param);
  76.  
  77. return sortDescending ? qSource.OrderByDescending(sortLambdaExpression) : qSource.OrderBy(sortLambdaExpression);
  78. }
  79. else if (memberExpression.Type == typeof(DateTime))
  80. {
  81. Expression<Func<T, DateTime>> sortLambdaExpression = Expression.Lambda<Func<T, DateTime>>
  82. (Expression.Convert(memberExpression, typeof(DateTime)), param);
  83.  
  84. return sortDescending ? qSource.OrderByDescending(sortLambdaExpression) : qSource.OrderBy(sortLambdaExpression);
  85. }
  86. else if (memberExpression.Type == typeof(DateTime?))
  87. {
  88. Expression<Func<T, DateTime?>> sortLambdaExpression = Expression.Lambda<Func<T, DateTime?>>
  89. (Expression.Convert(memberExpression, typeof(DateTime?)), param);
  90.  
  91. return sortDescending ? qSource.OrderByDescending(sortLambdaExpression) : qSource.OrderBy(sortLambdaExpression);
  92. }
  93. else
  94. {
  95. Expression<Func<T, object>> sortLambdaExpression = Expression.Lambda<Func<T, object>>
  96. (Expression.Convert(memberExpression, typeof(object)), param);
  97.  
  98. return sortDescending ? qSource.OrderByDescending(sortLambdaExpression) : qSource.OrderBy(sortLambdaExpression);
  99. }
  100. }
  101. }

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.

Sledujte moje články: vybrali.sme.sk Linkuj.cz  

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

Komentáre

RSS komentárovRSS komentárov

K článku "Radenie IEnumerable v C# a Linq" zatiaľ nie sú žiadne komentáre.

 

Pridať komentár

(povinné)

(povinný,nezverejňuje sa)


Odoslať komentár

Autor

Igor Kulman Igor Kulman at LinkeIn
Igor Kulman at Facebook
Igor Kulman at Flick
Igor Kulman at Twitter

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.

Kategórie

Náhodná referencia

Caravany Otmarov

Caravany Otmarov