目前,我们为所有实体使用通用存储库,该存储库公开 IQueryable(使用 NH3 linq 支持),然后我们的服务层使用该通用存储库来构建特定查询。
我现在需要急切地加载一个关联。有什么方法可以公开 IQueryable 并传入可选的获取表达式吗?我看到的问题是 Fetch 必须出现在表达式的最后(根据http://mikehadlow.blogspot.com/2010/08/nhibernate-linq-eager-fetching.html http://mikehadlow.blogspot.com/2010/08/nhibernate-linq-eager-fetching.html).
我很好奇其他人是如何实现这一目标的。
我确实考虑过将 Linq 规范传递到存储库,以便可以在调用 Fetch 之前对这些规范进行评估。然而,我仍然需要某种方式来传递 Fetch 表达式。
谢谢
本
我使用我的超载FindOne
and FindAll
存储库调用来实现这一点..类似于:
Function FindOne(ByVal spec As ILinqSpecification(Of T)) As T
Function FindOne(ByVal spec As ILinqSpecification(Of T), ByVal strategy As IFetchingStrategy(Of T)) As T
Function FindAll(ByVal spec As ILinqSpecification(Of T)) As IQueryable(Of T)
Function FindAll(ByVal spec As ILinqSpecification(Of T), ByVal strategy As IFetchingStrategy(Of T)) As IQueryable(Of T)
etc..
也许不是最干净的方法,但它确实有效。我不确定这是否仍然是 trunk linq 提供程序的问题,但我也可以决定是否将不同的结果转换器应用于我的结果FindAll
基于我的获取策略是否包含集合的场景。
我的规范和获取策略实现基于ncommon https://github.com/riteshrao/ncommon/项目。
作为参考,我的完整通用“只读”存储库界面如下:
Public Interface IReadOnlyRepositoryWithTypedId(Of T As IEntityWithTypedId(Of IdT), IdT)
Function LoadById(ByVal id As IdT) As T
Function GetById(ByVal id As IdT) As T
Function FindOne(ByVal spec As ILinqSpecification(Of T)) As T
Function FindOne(ByVal spec As ILinqSpecification(Of T), ByVal strategy As IFetchingStrategy(Of T)) As T
Function GetCount() As Integer
Function GetCount(ByVal spec As ILinqSpecification(Of T)) As Integer
Function HasAny(ByVal spec As ILinqSpecification(Of T)) As Boolean
Function FindAll(ByVal spec As ILinqSpecification(Of T)) As IQueryable(Of T)
Function FindAll(ByVal spec As ILinqSpecification(Of T), ByVal strategy As IFetchingStrategy(Of T)) As IQueryable(Of T)
Function FindAll() As IQueryable(Of T)
Function FindAll(ByVal strategy As IFetchingStrategy(Of T)) As IQueryable(Of T)
End Interface
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)