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);
}
}