Запросы Nhibernate с объединением (или извлечением) возвращают дубликаты
Я встречаюсь с неожиданным поведением, и мне не ясно. Конечно, я могу использовать разные, но в чем причина?
У меня есть объекты (беглое авто-отображение):
public class Ticket
{
public virtual int Id { get; set; }
public virtual string Title { get; set; }
public virtual IList<Activity> Activities { get; set; }
}
public class Activity
{
public virtual int Id { get; set; }
public virtual string Title { get; set; }
public virtual Ticket Ticket { get; set; }
}
Тестовые данные (1 билет с 5 упражнениями):
new Ticket { Id = 1, Activities = new List<Activity>
{
new Activity(), new Activity(), new Activity(), new Activity()
};
Запрос:
var report = GetSessionFactory()
.OpenSession()
.QueryOver<Ticket>()
.JoinAlias(ticket => ticket.Activities, () => activity)
.List<Ticket>();
И у меня есть следующий результат:
1 ответ
Когда вы стоите, вы возвращаете декартово произведение, присоединяясь к one-to-many
таблица, в вашем случае 1 х 5 строк. Так что если вы хотите пойти по этому маршруту, вам нужно будет добавить .TransformUsing(Transformers.DistinctRootEntity)
Вы уверены, что не хотите загружать активность и использовать ленивую загрузку для извлечения операций? В большинстве случаев это может быть более эффективным способом.
Что-то вроде:-
var ticket = session.QueryOver<Ticket>.Where(w => w.Id == id).SingleOrDefault();
OR
var ticket = session.Get<Ticket>(1);
тогда вы можете просто позвонить
foreach(var activity in ticket.Activities)
{
// do something here....
}