You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 08:42:39