You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 20:05:17