EF Core/.NET 6中Expression Select映射导航集合报错求助
解决EF Core中ICollection导航属性的Expression映射问题
问题核心在于:你的Variations是ICollection<T>类型,它仅实现了IEnumerable<T>,但Queryable.Select方法要求接收者为IQueryable<T>,而你传入的VariationMapper是Expression<Func<...>>类型,因此触发了类型不匹配的错误。
以下是两种可行的解决方法:
方法一:保持IQueryable特性(推荐)
对导航集合调用AsQueryable(),将其转换为IQueryable<T>类型,这样就能配合Expression版本的VariationMapper使用,EF Core会把整个表达式翻译成SQL,保持延迟执行的特性:
public Expression<Func<Item, ItemModel>> MapToModel => Ent => new ItemModel { Id = Ent.Id, Name = Ent.Name, SKU = Ent.SKU, Variations = Ent.Variations?.AsQueryable().Select(this.VariationMapper), };
方法二:客户端内存映射(不推荐)
如果可以接受在客户端内存中处理子集合的映射,可以把Expression编译为Func,用Enumerable.Select处理,但这样会失去IQueryable的延迟执行优势,子集合会被提前加载到内存中:
public Expression<Func<Item, ItemModel>> MapToModel => Ent => new ItemModel { Id = Ent.Id, Name = Ent.Name, SKU = Ent.SKU, Variations = Ent.Variations?.Select(this.VariationMapper.Compile()), };
注意:方法一需要EF Core 3.0及以上版本支持,这也是EF Core处理导航集合投影的标准方式,能确保查询被正确翻译到数据库层面执行。
内容的提问来源于stack exchange,提问作者Ezra Bailey
相关产品推荐
相关产品推荐

