NHibernate正在生成一个加入不好的SQL

我有一个NHibernate的Linq查询,这是不工作的,我期望如何。

该问题似乎来自where子句中左连接表中的可空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视图上进行“老派”连接。 这会导致查询排除在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 joininner join (“老派”连接)


我已经使用存储ȍ 链接地址: http://www.djcxy.com/p/10475.html

上一篇: NHibernate is producing SQL with a bad join

下一篇: MySql Connector/Net current source (as of Feb