gpt4 book ai didi

使用通用存储库的 NHibernate Linq Eager Loading

转载 作者:行者123 更新时间:2023-12-03 16:32:04 25 4
gpt4 key购买 nike

目前,我们正在为所有实体使用一个通用存储库,该存储库公开一个 IQueryable(使用 NH3 linq 支持),然后我们的服务层使用它来构建特定查询。

我现在需要急切地加载一个关联。有什么方法可以公开 IQueryable 并传入可选的提取表达式吗?我看到的问题是 Fetch 必须在表达式中排在最后(根据 http://mikehadlow.blogspot.com/2010/08/nhibernate-linq-eager-fetching.html )。

我很好奇其他人是如何做到这一点的。

我确实考虑过可能将 Linq 规范传递给存储库,以便在调用 Fetch 之前评估这些规范。但是,我仍然需要某种方式来传递 Fetch 表达式。

谢谢本

最佳答案

我使用我的 FindOneFindAll 存储库调用的重载来实现这一点......类似:

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)

等..

也许这不是最干净的方法,但它可以完成工作。我不确定这是否仍然是主干 linq 提供程序的问题,但我也可以根据是否在 FindAll 场景中决定是否将不同的结果转换器应用于我的结果或者我的抓取策略不包含一个集合。

我的规范和抓取策略实现基于 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

关于使用通用存储库的 NHibernate Linq Eager Loading,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4165367/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com