为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
Smart猫小萌 2024-01-20 21:40:23
我有以下数据层设置: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}这会导致异常:表达式Where(源:DbSet,谓词:(m) => (未处理的参数:__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)); }为什么它不适用于 ICollection,但适用于 IEnumerable 和 List?我的许多客户端方法都采用 ICollection 作为参数。我正在使用 EF Core 3.0,但我相信我在 2.1 中遇到了同样的问题,它只是没有抛出,因为它在客户端上对其进行了评估。
查看完整描述

3 回答

?
当年话下

TA贡献1890条经验 获得超9个赞

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

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

https://github.com/dotnet/efcore/pull/17599


查看完整回答
反对 回复 2024-01-20
?
UYOU

TA贡献1878条经验 获得超4个赞

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

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


查看完整回答
反对 回复 2024-01-20
?
慕妹3146593

TA贡献1820条经验 获得超9个赞

当您转换为 IEnumerable() 或 List() 时,EFCore 会强制客户端评估,这就是它起作用的原因。(但以性能成本为代价)

  • “在版本 3.0 之前,Entity Framework Core 支持查询中任意位置的客户端评估”

  • 3.0 之前的 EFCore 版本还允许您在混合服务器和客户端评估时添加警告。

  • 然后 EF 更改了策略,不允许混合服务器和客户端评估,因此不会发生意外的性能问题。不过,情况比这要复杂一些,因此这里是EFCore 3.1 重大更改的链接*所有其他版本也可以在此处以及左侧菜单导航中找到,包括 3.0。


查看完整回答
反对 回复 2024-01-20
  • 3 回答
  • 0 关注
  • 106 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信