NHibernate создает SQL с неверным соединением

У меня есть запрос NHibernate Linq, который работает не так, как я ожидал.

Проблема, по-видимому, возникает из-за использования столбца int, допускающего значение NULL, из объединенной слева таблицы в предложении where. Это заставляет соединение действовать как внутреннее соединение.

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 по принципу «старой школы». Это приводит к тому, что запрос исключает допустимые действия, которые не имеют CaseId в таблице WorkflowAction.

Может ли кто-нибудь объяснить, почему 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, возвращающееся в обратном направлении ...

РЕДАКТИРОВАТЬ. Кажется, не помогает

7
задан Mark Withers 20 February 2012 в 18:13
поделиться