【发布时间】: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