使用存储库模式 - 出于 EF 性能原因选择实体的特定字段

Using Repository pattern - selecting specific fields of the entity for EF performance reasons

所以,我很难理解这个存储库模式。在很多文章、帖子等中,我读到存储库应该 return 只有数据库对象(没有 DTO,存储库中没有映射器)。所以你 return 单个数据库对象或对象列表。

这没问题,但是出于 EF(entity framework) 性能的原因,可以只 return 您需要的字段,而不是整个实体。

那么,您应该如何使用存储库模式来做到这一点?您不能 select 具有特定字段的数据库对象,因为它是分离的 (ctx.Users.Select(new User(){ properties }).FirstOrDefault()) ,你不能 return 一个匿名对象,正如我所读,return IQueryable<User> 和存储库外部的 select 所需字段不是好的做法。

可以分享一些练习吗?

我们用两种泛型函数解决了这个问题。您可以使用

  • A​​utomapper ProjectTo,它将定义基于泛型类型的映射。
  • 将自定义 select 或表达式写入 return 匿名对象。 (如果你传递它,你可以 return 匿名对象和 return 相同的泛型,这也是 Select 方法的签名的样子)

在这两种情况下,存储库不再 return 实体,但它也不负责对象的转换,而是 Automapper 库或具有 select 的调用者表达式正在处理这个问题。