如何根据合同号获取关联多合同的客户?EF查询问题解决
问题原因与修正方案
原查询的逻辑存在明显错误,导致无法正确匹配到拥有目标合同号的客户:
- 你当前用
x.Contracts.FirstOrDefault().ContractNumber == contractNumber,是取每个客户的第一个合同的编号去对比目标值,而非判断客户是否存在任意一个合同号匹配的记录。 - 这种写法不仅会漏掉那些第一个合同不匹配但其他合同匹配的客户,还可能在客户无合同时引发空引用异常;EF将该查询转换为SQL时,也会因为逻辑偏差返回不符合预期的第一条记录。
修正后的代码
场景1:仅需获取客户数据(不需要加载合同)
return await context.Customers .FirstOrDefaultAsync(x => x.Contracts.Any(c => c.ContractNumber == contractNumber));
场景2:需要同时加载该客户的所有合同
return await context.Customers .Include(x => x.Contracts) .FirstOrDefaultAsync(x => x.Contracts.Any(c => c.ContractNumber == contractNumber));
场景3:仅需加载匹配目标合同号的那一个合同(EF Core 5.0+支持)
return await context.Customers .Include(x => x.Contracts.Where(c => c.ContractNumber == contractNumber)) .FirstOrDefaultAsync(x => x.Contracts.Any(c => c.ContractNumber == contractNumber));
核心修正点是用Any()方法判断客户的合同集合中是否存在指定合同号的记录,这才符合你“根据合同号找对应客户”的需求。
内容的提问来源于stack exchange,提问作者user7849697
相关产品推荐
相关产品推荐

