NHibernate объект проекция - PullRequest
3 голосов
/ 12 мая 2011

Я использую NHibernate с QueryOver API для запроса сущностей моего домена.Проблема в получении дублирующих результатов.Например, при запросе следующего домена: domain

Я использую такой код:

  var list = Session.QueryOver<Post>()
                    .JoinQueryOver<Comment>(x => x.Comments)
                    .Where(c => c.Name == "Name")
                    .Take(5)
                    .List();

Сгенерированный SQL будет выглядеть следующим образом:

SELECT Top(5) * FROM Posts p left outer join Comments c on p.Id = c.PostId

Проблема здесьчто после левого соединения результирующий набор записей имеет более 5 строк.И тогда функция TOP применяется и обрезает результаты.Так, например, если в первом сообщении есть 5 комментариев, я получу это сообщение 5 раз, а другие не получу.

Я знаю, почему это происходит, и нашел хороший пост об этом.Но есть ли проекция, которая скажет nhibernate выбирать только столбцы из сущности Post, а не добавлять столбцы из сущности Comment в select?Может быть, следует использовать какой-то другой метод (не JoinQueryOver)?

Ответы [ 3 ]

3 голосов
/ 12 мая 2011

Во-первых, вам понадобится ссылка назад от Комментария к Посту.Я предполагаю, что это называется "Post"

Затем используйте подзапрос для фильтрации комментариев и последующих постов.

//the alias for post
Post post = null; 

var list = Session.QueryOver(() => post)
            .WithSubquery.WhereProperty(() => post.Id)
                .In(NHibernate.Criterion.QueryOver.Of<Comment>()
                    .Where(c => c.Name == "Name")
                    .Select(c => c.Post.Id))
            .Take(5)
            .List();

Сгенерированный SQL должен выглядеть примерно так:

SELECT Top(5) * FROM Posts p where p.Id in (select PostID from Comments c where c.Name = 'Name')
0 голосов
/ 12 июня 2012

Если вы хотите избежать дублирования в результатах объединения, вы можете использовать Transformer DistinctRootEntityResultTransformer, этот преобразователь удалит дублирование из сообщений, но не удалит дублирование из комментариев, если они объединены с другим объектом.В этой ситуации вам придется разработать собственный преобразователь для удаления дубликатов на втором уровне.

0 голосов
/ 12 мая 2011

мы использовали критерии. SetResultTransformer (new DistinctRootEntityResultTransformer ());чтобы избежать дублирования записей.

...