我在多个地方读过,存储库不应该返回IQueryable。
如果是这样的话,为什么在存储库中有一个ReadSelect函数?如果存储库正在拉动sql表中的所有列,则大多数查询不需要所有列,因此其额外的工作,未经优化的sql查询。有没有人有任何意见?谢谢,
Entity Framework Repository Pattern why not return Iqueryable?
答案 0 :(得分:0)
取自评论:
“大多数读取查询将填充域对象。因此,它们不会简单地返回所有列。它将构建实体。
我曾经有过存储库返回IQueryable,因为我可以在它之上构建其他查询。结果快速而直接,因为它最后只是一个SQL语句。缺点是未管理的代码。当需要更改“其他查询”时,它们可能无处不在!现在我只在我的存储库中有GetById()来从数据中填充域对象,就像@Greg所说的那样。 回购中的其余操作只是插入,更新或删除。我需要存储库,因为我喜欢在插入等操作之后执行其他逻辑,例如E.x.,记录,保存事件。
在读取方面,您可以直接使用dbContext为每个视图构建视图模型。这样你就可以抓住你需要的任何东西,它们对每个视图都是特定的。您可以在读写端选择不同的技术。您可以使用Dapper来读取/构建视图模型,使用EF Core来提交/持久化。
很多人选择了Repository,Context,然后是Factory。因此,存储库会将方法或契约作为接口。上下文将代表实施。然后工厂将实施的实例化。所以你会有类似using的语法(var context = new SampleContext()。Create()){return context.RetrieveSampleModels()); }“