我有以下数据层设置:
public class Repository : IRepository { private readonly MyDbContext _dbContext; public ListSearch(Expression > criteria) IQueryable results = _dbContext.Meters; return results.Where(criteria).ToList(); } } } ... from a client class: IRepository _repository; public void ClientMethod () { ICollection ids = new List () {1, 2, 3); var results = _repository.Search(c=> ids.Contains(c.Id)); // This throws exception }
这导致异常:
表达式where(source:DbSet,predicate:(m)=>(Unhandled parameter:__ids_0).Contains(m.Id))'无法翻译。以可以翻译的形式重写查询,或者通过插入对AsEnumerable(),AsAsyncEnumerable(),ToList()或ToListAsync()的调用来显式切换到客户端评估
但是,如果我将集合引用更改为IEnumerable或List,它将起作用:
public void ClientMethod () { // This works Listids = new List () {1, 2, 3); var results = _repository.Search(c=> ids.Contains(c.Id)); // This works IEnumerable ids = new List () {1, 2, 3); var results = _repository.Search(c=> ids.Contains(c.Id)); }
为什么对ICollection不起作用,对IEnumerable和List不起作用?我的许多客户端方法都将ICollection作为参数。
我使用的是EF Core 3.0,但我认为我在2.1中也遇到了同样的问题,它没有抛出错误,而是在客户端上对其进行了评估。
这是3.1中修复的已知错误。由于查询管道重写后的所有回归,3.0几乎不可用。
我建议在github上关注ef core的问题跟踪器。