gpt4 book ai didi

c# - NHibernate 正在生成连接错误的 SQL

转载 作者:太空狗 更新时间:2023-10-29 20:34:44 25 4
gpt4 key购买 nike

我有一个 NHibernate Linq 查询,它没有按我预期的方式工作。

问题似乎来自于在 where 子句中使用左联接表中的可为 null 的 int 列。这导致连接像内部连接一样运行。

var list = this.WorkflowDiaryManager.WorkflowActionRepository.All
.Fetch(x => x.CaseView)
.Fetch(x => x.WorkflowActionType)
.ThenFetchMany(x => x.WorkflowActionPriorityList)
.Where(x => x.AssignedUser.Id == userId || x.CaseView.MooseUserId == userId)

由此产生的 SQL 看起来像(从连接开始——你不需要看到所有的选择)

from Kctc.WorkflowAction workflowac0_ 
left outer join Kctc.WorkflowCaseView workflowca1_ on workflowac0_.CaseId=workflowca1_.CaseId
left outer join Kctc.WorkflowActionType workflowac2_ on workflowac0_.WorkflowActionTypeId=workflowac2_.WorkflowActionTypeId
left outer join Kctc.WorkflowActionPriority workflowac3_ on workflowac2_.WorkflowActionTypeId=workflowac3_.WorkflowActionTypeId
,Kctc.WorkflowCaseView workflowca4_
where workflowac0_.CaseId=workflowca4_.CaseId
and (workflowac0_.AssignedUser=@p0 or workflowca4_.[MooseUserId]=@p1);
@p0 = 1087 [Type: Int32 (0)],
@p1 = 1087 [Type: Int32 (0)]

所以导致问题的部分是上面代码片段的第 5 行。如您所见,NHibernate 正在尝试对我的 WorkflowCaseView View 进行“老式”连接。这会导致查询排除 WorkflowAction 表中没有 CaseId 的其他有效操作。

谁能解释为什么 NHibernate 正在编写这个 SQL,以及我如何鼓励它产生更好的查询?

谢谢!

WorkflowActionMap 的重要部分

        Table("Kctc.WorkflowAction");
Id(x => x.Id).GeneratedBy.Identity().Column("WorkflowActionId");
References(x => x.WorkflowActionType).Column("WorkflowActionTypeId").Unique();
References(x => x.CompletedBy).Column("CompletedBy");
References(x => x.CaseView).Column("CaseId").Not.Update().Unique();
References(x => x.AssignedUser).Column("AssignedUser");

WorkflowCaseViewMap 的重要部分

        Table("Kctc.WorkflowCaseView");
Id(x => x.Id).Column("CaseId");
Map(x => x.MooseUserId).Nullable();

看着这个,我想知道我是否应该让 HasMany 以另一种方式返回......

编辑。似乎没有帮助

最佳答案

我认为您需要将 Where 子句更改为:

.Where(x => x.AssignedUser.Id == userId || 
(x.CaseView != null && x.CaseView.MooseUserId == userId))

使用当前的 Where 子句,您告诉 NHibernate 始终会有一个 CaseView,因为您无条件地访问它的属性。基于此信息,NHibernate 将您的查询从 left outer join 优化为 inner join(“老式”联接)

关于c# - NHibernate 正在生成连接错误的 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9327898/

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