测试结果:

没加任何索引 或者 优化方法--17.89S

优化之后 -- 3.67S

方法如下:

Repository基类:

public class Repository<T> : IRepository<T> where T : class, new()
{
    private readonly ISqlSugarClient _db;

    public Repository(ISqlSugarClient db)
    {
        _db = db;
    }
    // 查询列表,支持条件和分页
    public async Task<List<T>> GetQueryable(Expression<Func<T, bool>> filter = null, int? pageIndex = null, int? pageSize = null)
    {
        try
        {
            var query = _db.Queryable<T>();

            // 应用过滤条件
            if (filter != null)
            {
                query = query.Where(filter);
            }

            // 如果提供了分页参数
            if (pageIndex.HasValue && pageSize.HasValue)
            {
                query = query.Skip(pageSize.Value * (pageIndex.Value - 1)).Take(pageSize.Value);
            }

            return await query.ToListAsync();
        }
        catch (Exception ex)
        {
            // 处理异常或记录日志
            // 可考虑使用日志库如 NLog 或 Serilog
            return new List<T>();  // 返回空列表而不是 null
        }
    }
    public async Task<(int Count, List<T> List)> CountAndToListAsync(Expression<Func<T, bool>> filter = null, int? pageIndex = null, int? pageSize = null)
    {
        try
        {
            var query = _db.Queryable<T>(); // 用合适的方式获取 IQueryable<T>

            // 应用过滤条件
            if (filter != null)
            {
                query = query.Where(filter);
            }

            // 记录总数
            var count = await query.CountAsync();

            // 如果提供了分页参数
            if (pageIndex.HasValue && pageSize.HasValue)
            {
                query = query.Skip(pageSize.Value * (pageIndex.Value - 1))
                             .Take(pageSize.Value);
            }

            // 执行查询
            var list = await query.ToListAsync();

            return (count, list); // 返回记录数和列表
        }
        catch (Exception ex)
        {
            // 处理异常或记录日志
            // 记录日志代码
            return (0, new List<T>()); // 返回空列表和记录数为0
        }
    }
}

IRepository实现:

public interface IRepository<T> where T : class, new()
{
    Task<List<T>> GetQueryable(Expression<Func<T, bool>> filter = null, int? pageIndex = null, int? pageSize = null);
    Task<(int Count, List<T> List)> CountAndToListAsync(Expression<Func<T, bool>> filter = null, int? pageIndex = null, int? pageSize = null); 
}

ExpressionExtensions类:

public static class ExpressionExtensions
{
    public static Expression<Func<T, bool>> And<T>(
        this Expression<Func<T, bool>> expr1,
        Expression<Func<T, bool>> expr2)
    {
        var parameter = Expression.Parameter(typeof(T));

        var combined = new ReplaceParametersVisitor(parameter, expr1.Body).Visit(expr1.Body);
        var second = new ReplaceParametersVisitor(parameter, expr2.Body).Visit(expr2.Body);

        var andExpression = Expression.AndAlso(combined, second);
        return Expression.Lambda<Func<T, bool>>(andExpression, parameter);
    }

    private class ReplaceParametersVisitor : ExpressionVisitor
    {
        private readonly Expression _replacement;
        private readonly Expression _oldValue;

        public ReplaceParametersVisitor(Expression oldValue, Expression replacement)
        {
            _oldValue = oldValue;
            _replacement = replacement;
        }

        public override Expression Visit(Expression node)
        {
            return node == _oldValue ? _replacement : base.Visit(node);
        }
    }
}

服务实现:

public class VIPService : IDynamicWebApi
{
    public readonly SqlSugarContext db;
    private readonly IRepository<SavingsManagement> Savingsrepository;
    private readonly IMapper mapper;
    public VIPService(SqlSugarContext context,  IMapper mapper,  IRepository<SavingsManagement> savingsrepository)
    {
        this.db = context;
        _repository = repository;
        this.mapper = mapper;
        this.Savingsrepository = savingsrepository;
    }
    /// <summary>
    /// SQLSugar创建表
    /// </summary>
    /// <returns></returns>
    [HttpGet]
    public async Task<ResultDTO<bool>> CreateTable()
    {
        db.InitializeTables();
        return new ResultDTO<bool> { Code = CodeType.Success, Message = "执行成功!" };
    }
    /// <summary>
    /// 获取储值+条件查询+分页显示
    /// </summary>
    /// <returns></returns>
    [HttpGet]
    public async Task<ResultDTO<PageDTO<List<SavingsManagement>>>> GetSavingPageDepartments(int PageIndex, int PageSize, int? Member_Grade, string SearchText)
    {
        // 构建查询条件
        Expression<Func<SavingsManagement, bool>> filter = x => true;

        // 添加 Member_Grade 过滤条件
        if (Member_Grade.HasValue)
        {
            filter = filter.And(x => x.Member_Grade == Member_Grade.Value);
        }

        // 处理 SearchText
        if (!string.IsNullOrWhiteSpace(SearchText))
        {
            var searchParts = SearchText.Split('/');
            string namePart = searchParts.ElementAtOrDefault(0) ?? string.Empty; // 姓名
            string cardNumberPart = searchParts.ElementAtOrDefault(1) ?? string.Empty; // 卡号
            string phoneNumberPart = searchParts.ElementAtOrDefault(2) ?? string.Empty; // 电话号码

            if (!string.IsNullOrWhiteSpace(namePart))
            {
                filter = filter.And(x => x.Member_Name.Contains(namePart));
            }
            if (!string.IsNullOrWhiteSpace(cardNumberPart))
            {
                filter = filter.And(x => x.Card_Number.ToString().Contains(cardNumberPart));
            }
            if (!string.IsNullOrWhiteSpace(phoneNumberPart))
            {
                filter = filter.And(x => x.Phone.Contains(phoneNumberPart));
            }
        }

        // 使用 GetQueryable 一次性查询所需数据和总记录数
        var (count, list) = await Savingsrepository.CountAndToListAsync(filter, PageIndex, PageSize);

        return new ResultDTO<PageDTO<List<SavingsManagement>>>
        {
            Code = 0,
            Message = "获取成功",
            Data = new PageDTO<List<SavingsManagement>>
            {
                Total = count,
                Page = (int)Math.Ceiling(count / (double)PageSize),
                List = list
            }
        };
    }
}