using Microsoft.EntityFrameworkCore; using Serilog; using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Reflection; using System.Text; using System.Threading.Tasks; using TaskManager.Entity; using TaskManager.EntityFramework; using Wood.Util; using Wood.Util.Filters; namespace TaskManager.EntityFramework.Repository { public class Repository : IRepository where TEntity : BaseEntity { private JobDbContext _context; private DbSet _dbSet; public Repository(JobDbContext context) { _context = context; _dbSet = context.Set(); } public void SetDbContext(JobDbContext context) { _context = context; _dbSet = context.Set(); } public async Task GetByIdAsync(long id) { return await _dbSet.FindAsync(id); } public async Task> GetAllAsync() { return await _dbSet.ToListAsync(); } public async Task AddAsync(TEntity entity) { entity.CreationTime = DateTime.UtcNow; await _dbSet.AddAsync(entity); await _context.SaveChangesAsync(); return entity; } public async Task UpdateAsync(TEntity entity) { _dbSet.Update(entity); await _context.SaveChangesAsync(); } public async Task DeleteAsync(long id) { var entity = await _dbSet.FindAsync(id); if (entity != null) { _dbSet.Remove(entity); await _context.SaveChangesAsync(); } } public async Task> GetPagedAsync(PagingParams pagingParams) { return await _dbSet.AsNoTracking().ToPagedListAsync(pagingParams); } public async Task> GetPagedAsync( Expression> filter = null, PagingParams pagingParams = null) { IQueryable query = _dbSet.AsNoTracking(); // 应用过滤条件 if (filter != null) { query = query.Where(filter); } // 应用动态过滤 if (pagingParams?.Filters != null && pagingParams.Filters.Any()) { query = query.ApplyFilters(pagingParams.Filters); } // 应用分页和排序 pagingParams ??= new PagingParams(); var page=await query.ToPagedListAsync(pagingParams); return page; } public async Task> GetDataPagedAsync( Expression> filter = null, PagingParams pagingParams = null,Condition condition = null) { IQueryable query = _dbSet.AsNoTracking(); // 应用过滤条件 if (filter != null) { query = query.Where(filter); } // 应用动态过滤 if (condition?.Filters != null && condition.Filters.Any()) { query = query.ApplyConditionFilters(condition); } // 应用分页和排序 pagingParams ??= new PagingParams(); var page = await query.ToPagedListAsync(pagingParams); return page; } } public class PagedResult { public List Data { get; set; } public int TotalCount { get; set; } public int PageNumber { get; set; } public int PageSize { get; set; } public int TotalPages => (int)Math.Ceiling(TotalCount / (double)PageSize); public PagedResult() { Data = new List(); } } public class PagingParams { private const int MaxPageSize = 50; private int _pageSize = 10; public int PageNumber { get; set; } = 1; public int PageSize { get => _pageSize; set => _pageSize = (value > MaxPageSize) ? MaxPageSize : value; } public string SortBy { get; set; } public bool IsAscending { get; set; } = true; // 新增:过滤条件(键值对) public Dictionary Filters { get; set; } = new(); } public static class QueryableExtensions { public static IQueryable ApplySort(this IQueryable query, string sortBy, bool isAscending) { if (string.IsNullOrEmpty(sortBy)) return query; var parameter = Expression.Parameter(typeof(T), "x"); var property = Expression.Property(parameter, sortBy); var lambda = Expression.Lambda(property, parameter); var methodName = isAscending ? "OrderBy" : "OrderByDescending"; var resultExpression = Expression.Call( typeof(Queryable), methodName, new[] { typeof(T), property.Type }, query.Expression, Expression.Quote(lambda)); return query.Provider.CreateQuery(resultExpression); } public static IQueryable ApplyFilters(this IQueryable query, Dictionary filters) { if (filters == null || !filters.Any()) return query; foreach (var filter in filters) { var property = typeof(T).GetProperty(filter.Key, BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance); if (property != null) { var parameter = Expression.Parameter(typeof(T), "x"); var propertyAccess = Expression.Property(parameter, property); var constant = Expression.Constant( Convert.ChangeType(filter.Value, property.PropertyType)); var equalExpression = Expression.Equal(propertyAccess, constant); var lambda = Expression.Lambda>(equalExpression, parameter); query = query.Where(lambda); } } return query; } public static IQueryable ApplyConditionFilters(this IQueryable query, Condition condition) { if (condition.Filters == null || !condition.Filters.Any()) return query; query = query.Where(condition.Filters.ToLambda()); return query; } public static IQueryable ApplyStringFilter(this IQueryable query, string propertyName, string value) { var property = typeof(T).GetProperty(propertyName, BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance); if (property != null && property.PropertyType == typeof(string) && !string.IsNullOrEmpty(value)) { var parameter = Expression.Parameter(typeof(T), "x"); var propertyAccess = Expression.Property(parameter, property); var containsMethod = typeof(string).GetMethod("Contains", new[] { typeof(string) }); var constant = Expression.Constant(value); var containsExpression = Expression.Call(propertyAccess, containsMethod, constant); var lambda = Expression.Lambda>(containsExpression, parameter); query = query.Where(lambda); } return query; } public static async Task> ToPagedListAsync(this IQueryable source, PagingParams pagingParams) { var count = await source.CountAsync(); var items = await source .ApplySort(pagingParams.SortBy, pagingParams.IsAscending) .Skip((pagingParams.PageNumber - 1) * pagingParams.PageSize) .Take(pagingParams.PageSize) .ToListAsync(); return new PagedResult { Data = items, TotalCount = count, PageNumber = pagingParams.PageNumber, PageSize = pagingParams.PageSize }; } } }