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

时间:2017-09-28 06:52:59

标签: c# asp.net entity-framework asp.net-web-api repository-pattern

所以,我在使用这个Repository模式时遇到了困难。在很多文章,帖子等中,我读到存储库应该只返回数据库对象(没有DTO,存储库中没有映射器)。因此,您返回单个数据库对象或对象列表。

这没关系,但是对于EF(实体框架)性能原因,只返回您需要的字段,而不是整个实体。

那么,你应该如何使用存储库模式呢?您无法选择具有特定字段的数据库对象,因为它已分离 (ctx.Users.Select(new User(){ properties }).FirstOrDefault()) ,你不能返回一个匿名对象,并且当我读到它时,返回IQueryable<User>并在存储库外部选择所需的字段是不好的做法。

你能分享一些练习吗?

1 个答案:

答案 0 :(得分:3)

我们用2种类型的通用函数解决了它。你可以使用

  • Automapper ProjectTo,它将根据泛型类型定义映射。
  • 编写自定义选择器表达式以返回匿名对象。 (如果您传递匿名对象并返回相同的通用对象,则可以返回匿名对象,这也是Select方法签名的样子)

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