【发布时间】:2020-11-01 22:36:33
【问题描述】:
我在 SO 上看到了十几个这样的问题,但没有一个对我有任何帮助,所以我决定再发布一个,尝试解决我的问题。
我有一个GenericRepository<T> 类作为基本CRUD 方法的模板,因为我有一个比较大的模型包,所以我不想一遍又一遍地为不同的类实现相同的方法(不要重复自己)。
当我尝试使用Predicate<T> 创建用于查询的自定义方法时,出现了问题。
这是我的代码:
public IEnumerable<T> GetMatching(Predicate<T> condition)
=> dbContext.Set<T>.Where(entity => condition(entity));
在我看来,这样做的目的是能够传递任何类型的查询,对其进行评估并作为结果返回。
这是我尝试通过使用名为 EmployeeID 的字段过滤它们来获取一些 Doctor 对象的部分:
Repository.GetMatching(doctor => doctor.EmployeeID > 10);
这个想法是,给我一个医生名单,他们的EmployeeID 数字字段大于 10。
不幸的是,这给了我以下错误:
Unhandled exception. System.InvalidOperationException: The LINQ expression 'DbSet<Doctor>
.Where(d => Invoke(__condition_0, d[Doctor]))' could not be translated.
Either rewrite the query in a form that can be translated, or switch to client
evaluation explicitly by inserting a call to either
AsEnumerable(), AsAsyncEnumerable(), ToList(), or ToListAsync().
根据错误信息,我尝试在GetMatching()函数的末尾添加ToList(),但没有成功,仍然失败并显示相同的错误信息。
我错过了什么?
【问题讨论】:
标签: entity-framework entity-framework-core linq-to-entities