我有一个 Entity Framework 查询来返回工资及其客户列表:
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
并且客户端实体具有 ClientName
, ContractStartingDate
和 ContractEndDate
,我想在每个父级上获取客户端名称,其中父级 startDate
位于客户端 ContractStartingDate
和 之间>契约(Contract)结束日期
所以我有一个父对象的 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
为 null,则客户端也应添加到列表中
我怎样才能实现这一目标?问候
最佳答案
另一种方法可能是使用 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);
关于c# - 使用 linq 根据日期之间获取结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75009756/