表达式中的EF Core 3 x.Contains(),其中x是ICollection

zol*_*a25 3 entity-framework-core ef-core-2.1 ef-core-3.0

我有以下数据层设置:

public class Repository : IRepository {

    private readonly MyDbContext _dbContext;

        public List<Meter> Search(Expression<Func<Meter,bool>> criteria)
            IQueryable<Meter> results = _dbContext.Meters;
            return results.Where(criteria).ToList();
        }
    }
}

... from a client class:

IRepository _repository;

public void ClientMethod () {

    ICollection<int> ids = new List<int>() {1, 2, 3);
    var results = _repository.Search(c=> ids.Contains(c.Id)); // This throws exception

}
Run Code Online (Sandbox Code Playgroud)

这导致异常:

表达式where(source:DbSet,predicate:(m)=>(Unhandled parameter:__ids_0).Contains(m.Id))'无法翻译。以可以翻译的形式重写查询,或者通过插入对AsEnumerable(),AsAsyncEnumerable(),ToList()或ToListAsync()的调用来显式切换到客户端评估

但是,如果我将集合引用更改为IEnumerable或List,它将起作用:

public void ClientMethod () {

    // This works
    List<int> ids = new List<int>() {1, 2, 3);
    var results = _repository.Search(c=> ids.Contains(c.Id)); 

    // This works
    IEnumerable<int> ids = new List<int>() {1, 2, 3);
    var results = _repository.Search(c=> ids.Contains(c.Id)); 
}
Run Code Online (Sandbox Code Playgroud)

为什么对ICollection不起作用,对IEnumerable和List不起作用?我的许多客户端方法都将ICollection作为参数。

我使用的是EF Core 3.0,但我认为我在2.1中也遇到了同样的问题,它没有抛出错误,而是在客户端上对其进行了评估。

小智 8

从 2.2 迁移到 EF Core 3.0 时,我遇到了同样的问题。我之前已经配置了 ef 以在客户端评估中抛出错误,并且它工作正常。所以我确定这是 3.0 的一个新问题,是在他们重写 linq 引擎时引入的。

将它转换为 IEnumerable 或 List 也适用于我,感谢您的提示!


joa*_*del 5

这是3.1中修复的已知错误。由于查询管道重写后的所有回归,3.0几乎不可用。

我建议在github上关注ef core的问题跟踪器。