QueryableExt.cs 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. using AutoMapper;
  2. using AutoMapper.QueryableExtensions;
  3. using Masuit.LuceneEFCore.SearchEngine;
  4. using Masuit.Tools.Models;
  5. using Microsoft.EntityFrameworkCore;
  6. using Z.EntityFramework.Plus;
  7. namespace Masuit.MyBlogs.Core.Infrastructure.Repository;
  8. public static class QueryableExt
  9. {
  10. /// <summary>
  11. /// 从二级缓存生成分页集合
  12. /// </summary>
  13. /// <typeparam name="T"></typeparam>
  14. /// <param name="query"></param>
  15. /// <param name="page">当前页</param>
  16. /// <param name="size">页大小</param>
  17. /// <returns></returns>
  18. public static PagedList<T> ToCachedPagedList<T>(this IOrderedQueryable<T> query, int page, int size) where T : LuceneIndexableBaseEntity
  19. {
  20. page = Math.Max(1, page);
  21. var totalCount = query.Count();
  22. if (1L * page * size > totalCount)
  23. {
  24. page = (int)Math.Ceiling(totalCount / (size * 1.0));
  25. }
  26. if (page <= 0)
  27. {
  28. page = 1;
  29. }
  30. var list = query.Skip(size * (page - 1)).Take(size).FromCache().ToList();
  31. return new PagedList<T>(list, page, size, totalCount);
  32. }
  33. /// <summary>
  34. /// 生成分页集合
  35. /// </summary>
  36. /// <typeparam name="T"></typeparam>
  37. /// <typeparam name="TDto"></typeparam>
  38. /// <param name="query"></param>
  39. /// <param name="page">当前页</param>
  40. /// <param name="size">页大小</param>
  41. /// <param name="mapper"></param>
  42. /// <returns></returns>
  43. public static PagedList<TDto> ToPagedList<T, TDto>(this IOrderedQueryable<T> query, int page, int size, MapperConfiguration mapper)
  44. {
  45. page = Math.Max(1, page);
  46. var totalCount = query.Count();
  47. if (1L * page * size > totalCount)
  48. {
  49. page = (int)Math.Ceiling(totalCount / (size * 1.0));
  50. }
  51. if (page <= 0)
  52. {
  53. page = 1;
  54. }
  55. var list = query.Skip(size * (page - 1)).Take(size).ProjectTo<TDto>(mapper).ToList();
  56. return new PagedList<TDto>(list, page, size, totalCount);
  57. }
  58. /// <summary>
  59. /// 生成分页集合
  60. /// </summary>
  61. /// <typeparam name="T"></typeparam>
  62. /// <typeparam name="TDto"></typeparam>
  63. /// <param name="query"></param>
  64. /// <param name="page">当前页</param>
  65. /// <param name="size">页大小</param>
  66. /// <param name="mapper"></param>
  67. /// <returns></returns>
  68. public static async Task<PagedList<TDto>> ToPagedListAsync<T, TDto>(this IOrderedQueryable<T> query, int page, int size, MapperConfiguration mapper)
  69. {
  70. page = Math.Max(1, page);
  71. var totalCount = await query.CountAsync();
  72. if (1L * page * size > totalCount)
  73. {
  74. page = (int)Math.Ceiling(totalCount / (size * 1.0));
  75. }
  76. if (page <= 0)
  77. {
  78. page = 1;
  79. }
  80. var list = await query.Skip(size * (page - 1)).Take(size).ProjectTo<TDto>(mapper).ToListAsync();
  81. return new PagedList<TDto>(list, page, size, totalCount);
  82. }
  83. /// <summary>
  84. /// 从二级缓存生成分页集合
  85. /// </summary>
  86. /// <typeparam name="T"></typeparam>
  87. /// <typeparam name="TDto"></typeparam>
  88. /// <param name="query"></param>
  89. /// <param name="page">当前页</param>
  90. /// <param name="size">页大小</param>
  91. /// <param name="mapper"></param>
  92. /// <returns></returns>
  93. public static PagedList<TDto> ToCachedPagedList<T, TDto>(this IOrderedQueryable<T> query, int page, int size, MapperConfiguration mapper) where TDto : class where T : LuceneIndexableBaseEntity
  94. {
  95. page = Math.Max(1, page);
  96. var totalCount = query.Count();
  97. if (1L * page * size > totalCount)
  98. {
  99. page = (int)Math.Ceiling(totalCount / (size * 1.0));
  100. }
  101. if (page <= 0)
  102. {
  103. page = 1;
  104. }
  105. var list = query.Skip(size * (page - 1)).Take(size).ProjectTo<TDto>(mapper).FromCache().ToList();
  106. return new PagedList<TDto>(list, page, size, totalCount);
  107. }
  108. }