Я пытаюсь выполнить левое внешнее соединение с критериями nhibernate. У меня также есть фильтр, который применяется к моим запросам.
Проблема, с которой я столкнулся, заключается в том, что фильтр останавливает работу левого внешнего соединения, если результат соединения равен нулю.
В качестве очень простого примера я хочу вернуть всех музыкантов, и если они в группе, то и их группа
NHibernate генерирует следующий sql
SELECT this_.Name, band2_.Name
FROM Musicians this_
left outer join [Band] band2_
on this_.BandID = band2_.ID
WHERE (band2_.IsDeleted = 0)
, который не вернет музыкантов, если они не в группе. Я хочу что-то вроде
SELECT this_.Name, band2_.Name
FROM Musicians this_
left outer join [Band] band2_
on this_.BandID = band2_.ID
WHERE this_.ID = 4894 /* @p3 */
(band2_.ID IS NULL OR band2_.IsDeleted = 0)
Возможно ли это с nhibernate?
UPDATE
var projections = new[]
{
Projections.Property("Musician.Name").As("MusicianName"),
Projections.Property("Band.Name").As("BandName")
};
return this.sessionProvider.GetSession().CreateCriteria<Musician>("Musician")
.CreateCriteria("Musician.Band", "Band", JoinType.LeftOuterJoin)
.SetProjection(projections)
.Add(Restrictions.Eq("Musician.ID", parameters.MusicianId))
.SetResultTransformer(Transformers.AliasToBean<MusicianDetailsResult>())
.UniqueResult<MusicianDetailsResult>();
Фильтр определяется с помощью FluentNHibernate
this.WithName(FilterName).WithCondition("IsDeleted = 0")