У меня есть запрос NHibernate Linq, который не работает так, как я ожидал.
Проблема, похоже, связана с использованием пустого столбца int в левой объединенной таблице в предложении 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, возвращающуюся в другую сторону ...
EDIT. Кажется, не помогает