EF Core+Oracle时LINQ表达式转换失败,如何改写查询?
解决方案
问题根源是你使用的System.Data.Entity.DbFunctions属于EF6的API,EF Core(搭配Oracle.EntityFrameworkCore)无法识别并翻译这类方法,需要改用EF Core兼容的写法。
改写方式一(推荐,更易被数据库翻译)
将毫秒差比较转换为日期加减后的直接比较,逻辑等价且更直观:
using Microsoft.EntityFrameworkCore; // 先定义当前时间,避免查询中重复求值 var now = DateTime.Now; // 若使用UTC时间则改用DateTime.UtcNow var timeoutList = sessionRepository.Table.Include(m => m.Definition) .Where(x => x.STARTED_AT.AddMilliseconds(x.TIMEOUT) < now);
改写方式二(使用EF Core原生日期差函数)
如果Oracle.EntityFrameworkCore版本支持,也可以用EF Core的EF.Functions来调用日期差计算:
using Microsoft.EntityFrameworkCore; var now = DateTime.Now; var timeoutList = sessionRepository.Table.Include(m => m.Definition) .Where(x => EF.Functions.DateDiffMillisecond(x.STARTED_AT, now) > x.TIMEOUT);
额外注意事项
- 修正模型中的拼写错误:
Datetime改为DateTime(C#中类型名是大写T) - 移除代码中
using System.Data.Entity;的引用,避免EF6与EF Core API混淆 - 确认
TIMEOUT字段的单位确实是毫秒,若为秒需乘以1000转换为毫秒后再计算
内容的提问来源于stack exchange,提问作者ddagsan
相关产品推荐
相关产品推荐

