我有一个实体框架查询,返回一个薪水列表及其客户,如下所示:
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
和ContractEndDate
之间
所以我有一个父对象的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
为空,则客户端也应添加到列表中
我如何才能做到这一点?
2条答案
按热度按时间bfhwhh0e1#
另一种方法是使用EF.functions进行日期比较,但这可能有点过头了。
如果要从多个属性组成一个日期:
或者只是:
如果您不想包含确切的开始和结束日期,只需将〈=更改为〈。
最后,如果你只想知道名字。
9lowa7mx2#
我觉得你要找的是这样的东西
原始代码的问题在于,当您确实需要遍历客户端并根据筛选条件首先构建一个客户端列表时,您却在遍历名称。
有了客户列表之后,可以使用另一个linq查询
Select(c => c.Name);
从该列表中选择客户名称