【问题标题】:The LINQ expression could not be translated in EF Core 3.1无法在 EF Core 3.1 中翻译 LINQ 表达式
【发布时间】:2020-09-10 01:46:46
【问题描述】:

我正在尝试使用 EF Core 3.1 返回在任何列中包含指定短语的行。我得到了例外:

InvalidOperationException:LINQ 表达式 'DbSet
.Where(b => __stringProperties_0 .Any(y => __Functions_1 .Like(
_: y.GetValue(obj: b, index: null).ToString(), matchExpression: __p_2)))' 无法翻译。要么以可以翻译的形式重写查询,要么通过以下方式显式切换到客户端评估 插入对 AsEnumerable()、AsAsyncEnumerable() 的调用, ToList() 或 ToListAsync()。看 https://go.microsoft.com/fwlink/?linkid=2101038 了解更多信息。

如何重写此查询以避免此异常?

public async Task<List<Table>>
        GetDataAsync(string query)
    {
        var stringProperties = typeof(Table).GetProperties().Where(prop => prop.PropertyType == query.GetType());
        return await _context.Table
             .Where(x => stringProperties
                .Any(y => (EF.Functions.Like(y.GetValue(x, null).ToString(), "%" + query + "%"))))
             .AsNoTracking().ToListAsync();
    }

【问题讨论】:

  • 当您在最后的 stringProperties 变量上使用 ToList() 以便在运行到实体框架 LINQ 之前对其进行评估时,它是否有效?
  • 我收到异常“NullReferenceException:对象引用未设置为对象的实例。”尝试在 stringProperties 中使用 ToList() 时。
  • edit您的问题将您拥有的源代码包含为minimal reproducible example,其他人可以编译和测试。然后查看meta.stackoverflow.com/questions/333952/… 了解与 SQL 相关的问题。

标签: c# ef-core-3.1


【解决方案1】:

我认为这个查询应该这样做,我在这里使用 EF.Property 方法而不是反射。

return await _context.Table
             .Where(x => stringProperties
                .Any(y => (EF.Functions.Like(EF.Property<string>(x, stringProperties), "%" + query + "%"))))
             .AsNoTracking().ToListAsync();

希望对你有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-16
    • 1970-01-01
    • 2022-11-11
    • 2022-11-11
    • 1970-01-01
    • 1970-01-01
    • 2020-03-11
    相关资源
    最近更新 更多