EF Core 8中IQueryable ExceptBy无法翻译的技术咨询
EF Core 8对ExceptBy方法的LINQ查询翻译支持情况
EF Core 8不支持将ExceptBy方法翻译为SQL,尽管该方法调用后返回IQueryable<T>,但实际执行时EF Core无法生成对应的数据库查询语句,因此会抛出你遇到的翻译失败错误。
替代实现方案
如果你要实现的是“筛选出数据库中Id不在给定集合中的Elements”逻辑,可以改用Where配合Contains的反向判断,这个写法能被EF Core正确翻译为SQL的NOT IN语句:
var excludedIds = listOfElements.Select(e => e.Id).ToList(); var result = Context.Elements.Where(i => !excludedIds.Contains(i.Id)).ToList();
补充说明
- 若你需要的是完整实体的集合差集(而非仅基于主键),EF Core支持
Except方法,但需要确保实体类型实现了值相等比较,或者使用能被EF Core翻译的比较逻辑;不过对于大多数基于主键的场景,上述Where+Contains的写法更可靠且性能更优。 - 截至EF Core 8版本,
ExceptBy仍未被纳入可翻译的LINQ方法列表,后续版本可能会添加该支持,但当前版本若强行使用,要么触发翻译错误,要么只能先调用AsEnumerable()将数据拉取到客户端内存中执行(这种方式会加载全表数据,不推荐)。
内容的提问来源于stack exchange,提问作者Hicham Bouchikhi
相关产品推荐
相关产品推荐

