使用linq根据日期之间的差异获取结果

tcomlyy6  于 2023-01-06  发布在  其他
关注(0)|答案(2)|浏览(137)

我有一个实体框架查询,返回一个薪水列表及其客户,如下所示:

public async Task<List<Salary>> GetSalaryByClientIdAndProfileId(int profileId, int clientId)
{
    var profileClientSalary = this._db.Salaries.Where(pc => pc.ProfileId == profileId && pc.ClientId == clientId).OrderByDescending(x => x.StartDate);
    return profileClientSalary.Include(pc => pc.Client).Where(p => p.ProfileId == profileId).ToList();
}

如您所见,我向对象添加了客户端实体,因此我的父对象具有属性startDate,而客户端实体具有ClientNameContractStartingDateContractEndDate。我希望在每个父对象上获取客户端名称,其中父对象startDate位于客户端ContractStartingDateContractEndDate之间
所以我有一个父对象的foreach如下:

foreach(var salary in profileClientSalary)
{
    profile.Salaries.Add(new ProfileSalariesViewModel
    {
        StartDate = salary.StartDate,
        Customers = salary.Client.Name.Where(c => c.) 
        // Here I want to get client names where salary.startDate between Client.ContractStartingDate and Client.ContractEndDate
    });
}

注意:如果Client.ContractEndDate为空,则客户端也应添加到列表中
我如何才能做到这一点?

bfhwhh0e

bfhwhh0e1#

另一种方法是使用EF.functions进行日期比较,但这可能有点过头了。
如果要从多个属性组成一个日期:

var filteredSalaries = profileClientSalary.Where(salary => EF.Functions.DateFromParts(salary.year, salary.month, salary.day) >= contractStartDate &&
                                                           EF.Functions.DateFromParts(salary.year, salary.month, salary.day) <= contractendDate);

或者只是:

var filteredSalaries = profileClientSalary.Where(salary => salary.startDate >= contractstartDate &&
                                    salary.startDate <= contractendDate);

如果您不想包含确切的开始和结束日期,只需将〈=更改为〈。
最后,如果你只想知道名字。

var clientNames = filteredSalaries.select(salaries => salaries.ClientName);
9lowa7mx

9lowa7mx2#

我觉得你要找的是这样的东西

profile.Salaries.Add(new ProfileSalariesViewModel
    {
        StartDate = salary.StartDate,
        Customers = salary.Client.Where(c => c.ContractStartingDate > StartDate && c.ContractEndDate < StartDate).Select(c => c.Name); 
    });

原始代码的问题在于,当您确实需要遍历客户端并根据筛选条件首先构建一个客户端列表时,您却在遍历名称。
有了客户列表之后,可以使用另一个linq查询Select(c => c.Name);从该列表中选择客户名称

相关问题