如何用LINQ筛选薪资StartDate在客户合同日期区间内的数据?
实现方案:筛选符合合同日期范围的客户并填充ViewModel
第一步:优化原Entity Framework查询
原查询存在冗余过滤逻辑,且未使用异步查询的正确方法,优化后的查询如下:
public async Task<List<Salary>> GetSalaryByClientIdAndProfileId(int profileId, int clientId) { return await _db.Salaries // 基础过滤条件 .Where(pc => pc.ProfileId == profileId && pc.ClientId == clientId) // 预加载关联的Client实体 .Include(pc => pc.Client) // 按薪资起始日期倒序排序 .OrderByDescending(x => x.StartDate) // 异步获取结果列表 .ToListAsync(); }
第二步:筛选符合日期条件的客户并填充ViewModel
假设ProfileSalariesViewModel包含Customers字段用于存储客户名称列表,以下是两种实现方式:
方式一:内存中遍历筛选(保留所有薪资记录,仅提取符合条件的客户)
// 获取薪资数据 var salaries = await GetSalaryByClientIdAndProfileId(targetProfileId, targetClientId); var viewModel = new ProfileSalariesViewModel(); // 用HashSet避免重复添加相同客户名称 var uniqueCustomerNames = new HashSet<string>(); foreach (var salary in salaries) { var client = salary.Client; if (client == null) continue; // 判断薪资StartDate是否在客户合同日期范围内(ContractEndDate为null时视为有效) bool isQualified = salary.StartDate >= client.ContractStartingDate && (client.ContractEndDate == null || salary.StartDate <= client.ContractEndDate); if (isQualified) { uniqueCustomerNames.Add(client.ClientName); } } // 将去重后的客户名称赋值给ViewModel viewModel.Customers = uniqueCustomerNames.ToList();
方式二:在EF查询阶段直接过滤(仅获取符合条件的薪资-客户关联)
如果不需要保留不符合日期条件的薪资记录,可以在查询阶段就完成过滤,减少内存处理压力:
public async Task<List<Salary>> GetQualifiedSalaryByClientIdAndProfileId(int profileId, int clientId) { return await _db.Salaries .Where(pc => pc.ProfileId == profileId && pc.ClientId == clientId) .Include(pc => pc.Client) // 直接过滤出符合日期条件的记录 .Where(s => s.Client != null && s.StartDate >= s.Client.ContractStartingDate && (s.Client.ContractEndDate == null || s.StartDate <= s.Client.ContractEndDate)) .OrderByDescending(x => x.StartDate) .ToListAsync(); }
之后提取客户名称:
var qualifiedSalaries = await GetQualifiedSalaryByClientIdAndProfileId(targetProfileId, targetClientId); var viewModel = new ProfileSalariesViewModel { Customers = qualifiedSalaries.Select(s => s.Client.ClientName).Distinct().ToList() };
内容的提问来源于stack exchange,提问作者Jesus
相关产品推荐
相关产品推荐

