使用存储库模式 - 出于 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 所需字段不是好的做法。
可以分享一些练习吗?
我们用两种泛型函数解决了这个问题。您可以使用
- Automapper ProjectTo,它将定义基于泛型类型的映射。
- 将自定义 select 或表达式写入 return 匿名对象。 (如果你传递它,你可以 return 匿名对象和 return 相同的泛型,这也是
Select
方法的签名的样子)
在这两种情况下,存储库不再 return 实体,但它也不负责对象的转换,而是 Automapper 库或具有 select 的调用者表达式正在处理这个问题。
所以,我很难理解这个存储库模式。在很多文章、帖子等中,我读到存储库应该 return 只有数据库对象(没有 DTO,存储库中没有映射器)。所以你 return 单个数据库对象或对象列表。
这没问题,但是出于 EF(entity framework) 性能的原因,可以只 return 您需要的字段,而不是整个实体。
那么,您应该如何使用存储库模式来做到这一点?您不能 select 具有特定字段的数据库对象,因为它是分离的
(ctx.Users.Select(new User(){ properties }).FirstOrDefault()
)
,你不能 return 一个匿名对象,正如我所读,return IQueryable<User>
和存储库外部的 select 所需字段不是好的做法。
可以分享一些练习吗?
我们用两种泛型函数解决了这个问题。您可以使用
- Automapper ProjectTo,它将定义基于泛型类型的映射。
- 将自定义 select 或表达式写入 return 匿名对象。 (如果你传递它,你可以 return 匿名对象和 return 相同的泛型,这也是
Select
方法的签名的样子)
在这两种情况下,存储库不再 return 实体,但它也不负责对象的转换,而是 Automapper 库或具有 select 的调用者表达式正在处理这个问题。