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

EF Core 8+Oracle使用值对象时LINQ Contains方法无法翻译问题

解决EF Core 8对接Oracle时值对象Contains查询无法翻译的问题

问题场景

需要实现Oracle数据库的模糊查询:

SELECT * 
FROM TASKS 
WHERE NAME LIKE "%Task%"

使用基于string的ValueObject(Name)编写LINQ查询时报错:

List<TaskEntity> tasks = await _dbSet.Where(x => x.Name.Value.Contains("Task"))
                                      .ToListAsync();

错误信息:

System.InvalidOperationException: 'The LINQ expression
'DbSet()
.Where(t => t.Name.Value.Contains("Task"))' could not be translated.

试过EF.Function.Like和FromSqlRaw,后者可行但需要IQueryable形式的查询方案。

可行解决方案

方案1:直接使用EF.Functions.Like

Oracle的EF Core Provider对EF.Functions.Like支持良好,直接在查询中调用即可生成对应的LIKE语句:

List<TaskEntity> tasks = await _dbSet
    .Where(x => EF.Functions.Like(x.Name.Value, "%Task%"))
    .ToListAsync();

如果需要动态拼接通配符,可用字符串插值:

string keyword = "Task";
List<TaskEntity> tasks = await _dbSet
    .Where(x => EF.Functions.Like(x.Name.Value, $"%{keyword}%"))
    .ToListAsync();

方案2:给值对象封装可翻译的Contains方法

在Name值对象中添加静态方法,封装EF.Functions.Like逻辑,让查询更贴合领域模型风格:

public class Name
{
    public string Value { get; }

    // 构造函数等其他逻辑...

    public static bool Contains(Name name, string substring)
    {
        return EF.Functions.Like(name.Value, $"%{substring}%");
    }
}

在LINQ查询中使用:

List<TaskEntity> tasks = await _dbSet
    .Where(x => Name.Contains(x.Name, "Task"))
    .ToListAsync();

方案3:创建IQueryable扩展方法

封装查询逻辑,简化重复调用:

public static class TaskEntityQueryExtensions
{
    public static IQueryable<TaskEntity> WhereNameContains(this IQueryable<TaskEntity> query, string substring)
    {
        return query.Where(x => EF.Functions.Like(x.Name.Value, $"%{substring}%"));
    }
}

调用方式:

List<TaskEntity> tasks = await _dbSet.WhereNameContains("Task").ToListAsync();

关键说明

原代码报错的核心原因是:EF Core无法将嵌套的x.Name.Value.Contains("Task")转换为Oracle的LIKE语句——普通string属性的Contains会被自动翻译,但值对象的嵌套属性访问超出了默认翻译器的识别范围。改用EF.Functions.Like可以明确指定生成LIKE语法,确保EF Core能正确转换为对应的Oracle SQL。

内容的提问来源于stack exchange,提问作者marcosagni98

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 16:30:58