EF Core中能否动态指定Linq查询实体集?如何简化重复查询代码?
简化设备租赁Linq查询重复代码的方案
针对你遇到的两类租赁查询重复度高的问题,可以通过提取通用查询逻辑,将差异部分参数化的方式彻底简化代码,核心是把DbSet、Include关联、筛选条件、Recipient取值这四个差异点作为参数传入通用方法,统一处理公共的DTO映射逻辑。
具体实现步骤
- 定义通用查询方法
编写一个泛型方法,接收四个差异参数和DbContext,封装公共的查询、映射逻辑:
private List<RentalDto> GetRentalList<T>( YourDbContext context, Func<YourDbContext, IQueryable<T>> getDbSet, Func<IQueryable<T>, IQueryable<T>> includeRelations, Expression<Func<T, bool>> filterCondition, Func<T, string> getRecipientName) where T : class { // 初始化查询 var query = getDbSet(context); // 应用关联查询 if (includeRelations != null) { query = includeRelations(query); } // 应用筛选条件 query = query.Where(filterCondition); // 统一映射为RentalDto return query.Select(entity => new RentalDto { // 公共字段映射,根据实际实体字段调整 RentalId = entity.Id, StartDate = entity.StartDate, EndDate = entity.EndDate, DeviceId = entity.DeviceId, // 动态传入Recipient取值逻辑 Recipient = getRecipientName(entity), // 其他公共属性... }).ToList(); }
- 调用通用方法生成两类租赁列表
针对分销商租赁和Causes租赁,分别传入对应的差异参数即可:
分销商租赁查询
var distributorRentals = GetRentalList<DistributorRental>( _dbContext, ctx => ctx.DistributorRentals, query => query.Include(r => r.Device).Include(r => r.Distributor), r => r.IsActive && r.RentalStartDate >= DateTime.Now.AddMonths(-12), r => r.Distributor.CompanyName );
Causes租赁查询
var causesRentals = GetRentalList<CauseRental>( _dbContext, ctx => ctx.CauseRentals, query => query.Include(r => r.Device).Include(r => r.Cause), r => r.IsActive && r.SubRentalStartDate >= DateTime.Now.AddMonths(-12), r => r.Cause.CauseName );
额外优化建议
- 如果两类查询的Include逻辑有重叠部分,可以单独提取为扩展方法,进一步减少重复。
- 若后续需要新增其他类型的租赁查询,只需复用该通用方法,传入对应参数即可,无需重复编写完整查询逻辑。
内容的提问来源于stack exchange,提问作者Avrohom Yisroel
相关产品推荐
相关产品推荐

