Я бы хотел ответить на свой вопрос.Спасибо Рафаль Рутковски за его ввод.
Чтобы получить данные, которые связаны только в 1 направлении, нам нужно ввести новую модель данных, а затем вручную преобразовать результат в наши объекты.Я надеюсь, что следующий пример является наилучшим возможным ответом:
1) создайте такую модель данных для хранения ответа NH:
private class PersonCarModelDto
{
public Guid PersonId { get; set; }
public string PersonName { get; set; }
public Guid CarId { get; set; }
public string CarBrand { get; set; }
}
2) создайте такую модель для хранения иерархических данных в качестве вывода:
private class PersonModel
{
public Guid Id { get; set; }
public string Name { get; set; }
public IList<CarModel> Cars { get; set; }
}
private class CarModel
{
public Guid Id { get; set; }
public string Brand { get; set; }
}
3) теперь запрос NH:
Person personAlias = null;
Car carAlias = null;
PersonCarModelDto resultAlias = null;
var response = GetCurrentSession().QueryOver<Car>(() => carAlias) // notice we are going from from 'downside' entity to 'up'
.Right.JoinAlias(c => c.Owner, () => personAlias) // notice Right join here, to have also Persons without any car
.SelectList(list => list
.Select(() => personAlias.Id).WithAlias(() => resultAlias.PersonId)
.Select(() => personAlias.Name).WithAlias(() => resultAlias.PersonName)
.Select(() => carAlias.Id).WithAlias(() => resultAlias.CarId)
.Select(() => carAlias.Brand).WithAlias(() => resultAlias.CarBrand)
.TransformUsing(Transformers.AliasToBean<PersonCarModelDto>())
.List<PersonCarModelDto>()
;
4) теперь у нас есть плоские данные в виде списка PersonCarModelDto, но мы хотим сделать выходную модель:
var modelResult = response.GroupBy(p => p.PersonId)
.Select(x => new PersonModel
{
Id = x.Key,
Name = x.Select(y => y.PersonName).First(), // First() because each PersonName in that group is the same
Cars = x.Select(y => new CarModel
{
Id = y.CarId,
Name = y.CarBrand
})
.ToList()
})
.ToList()
;
Выводы:
- проблему гораздо проще решить с помощью двунаправленных ассоциаций
- , если по какой-то причине вам не нужны двунаправленные ассоциации, используйтеэтот метод
- этот подход также полезен, если у ваших сущностей есть много других свойств, но по какой-то причине вам нужна только небольшая их часть (оптимизация данных, возвращаемых для БД)