using AutoMapper; using AutoMapper.QueryableExtensions; using Masuit.LuceneEFCore.SearchEngine; using Masuit.Tools.Models; using Microsoft.EntityFrameworkCore; using Z.EntityFramework.Plus; namespace Masuit.MyBlogs.Core.Infrastructure.Repository; public static class QueryableExt { /// /// 从二级缓存生成分页集合 /// /// /// /// 当前页 /// 页大小 /// public static PagedList ToCachedPagedList(this IOrderedQueryable query, int page, int size) where T : LuceneIndexableBaseEntity { page = Math.Max(1, page); var totalCount = query.Count(); if (1L * page * size > totalCount) { page = (int)Math.Ceiling(totalCount / (size * 1.0)); } if (page <= 0) { page = 1; } var list = query.Skip(size * (page - 1)).Take(size).FromCache().ToList(); return new PagedList(list, page, size, totalCount); } /// /// 生成分页集合 /// /// /// /// /// 当前页 /// 页大小 /// /// public static PagedList ToPagedList(this IOrderedQueryable query, int page, int size, MapperConfiguration mapper) { page = Math.Max(1, page); var totalCount = query.Count(); if (1L * page * size > totalCount) { page = (int)Math.Ceiling(totalCount / (size * 1.0)); } if (page <= 0) { page = 1; } var list = query.Skip(size * (page - 1)).Take(size).ProjectTo(mapper).ToList(); return new PagedList(list, page, size, totalCount); } /// /// 生成分页集合 /// /// /// /// /// 当前页 /// 页大小 /// /// public static async Task> ToPagedListAsync(this IOrderedQueryable query, int page, int size, MapperConfiguration mapper) { page = Math.Max(1, page); var totalCount = await query.CountAsync(); if (1L * page * size > totalCount) { page = (int)Math.Ceiling(totalCount / (size * 1.0)); } if (page <= 0) { page = 1; } var list = await query.Skip(size * (page - 1)).Take(size).ProjectTo(mapper).ToListAsync(); return new PagedList(list, page, size, totalCount); } /// /// 从二级缓存生成分页集合 /// /// /// /// /// 当前页 /// 页大小 /// /// public static PagedList ToCachedPagedList(this IOrderedQueryable query, int page, int size, MapperConfiguration mapper) where TDto : class where T : LuceneIndexableBaseEntity { page = Math.Max(1, page); var totalCount = query.Count(); if (1L * page * size > totalCount) { page = (int)Math.Ceiling(totalCount / (size * 1.0)); } if (page <= 0) { page = 1; } var list = query.Skip(size * (page - 1)).Take(size).ProjectTo(mapper).FromCache().ToList(); return new PagedList(list, page, size, totalCount); } }