.NET Core下LINQ查询无法翻译的报错问题求助
解决EF Core无法翻译LINQ查询的问题
这个错误是因为EF Core没法把你写的LINQ表达式直接转换成数据库能理解的SQL,主要有几个关键调整点,我给你分步说明:
1. 提前计算DateTime.Today值
EF Core在查询语句中直接使用DateTime.Today偶尔会出现翻译失败的情况,我们可以先把这个值计算好存到变量里,让EF Core能正确识别它是一个常量:
var today = DateTime.Today;
2. 简化状态判断逻辑
原来的多个!=条件判断可以换成集合的Contains方法,不仅代码更简洁,也更符合EF Core的查询翻译逻辑,避免因多条件组合导致的翻译异常:
var canceledStatuses = new[] { Domain.PetrolReceptions.PetrolReception.PetrolReceptionStatus.Canceled_Passed, Domain.PetrolReceptions.PetrolReception.PetrolReceptionStatus.Canceled_Failed, Domain.PetrolReceptions.PetrolReception.PetrolReceptionStatus.Canceled_Pending };
3. 替换LastOrDefault为倒序取第一条
数据库本身没有“取最后一条记录”的原生操作,LastOrDefault需要EF Core在客户端做评估,这也是触发错误的原因之一。我们可以把排序规则倒过来,然后取第一条记录,效果和原来完全一致,而且能被EF Core正确翻译成SQL:
整合后的完整代码
public Domain.PetrolReceptions.PetrolReception GetLastOpenNotCanceledByVIN(string vin, double openPetrolTestTimeInDays) { var today = DateTime.Today; var canceledStatuses = new[] { Domain.PetrolReceptions.PetrolReception.PetrolReceptionStatus.Canceled_Passed, Domain.PetrolReceptions.PetrolReception.PetrolReceptionStatus.Canceled_Failed, Domain.PetrolReceptions.PetrolReception.PetrolReceptionStatus.Canceled_Pending }; return _dbContext.PetrolReceptions // 如果导航属性Car或carBody未被正确关联查询,取消下方注释 // .Include(g => g.Car) // .ThenInclude(car => car.carBody) .Where(g => g.Car.carBody.vin == vin && g.CreatedDate.AddDays(openPetrolTestTimeInDays) >= today && !canceledStatuses.Contains(g.Status)) .OrderByDescending(g => g.CreatedDate) .FirstOrDefault(); }
额外提示
如果运行后还是出现导航属性相关的异常,可以取消代码中Include和ThenInclude的注释,确保EF Core能正确关联查询Car和carBody表的数据。
内容的提问来源于stack exchange,提问作者Ehsan Akbar
相关产品推荐
相关产品推荐

