Запросы 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....
}
Другие вопросы по тегам