QueryOver с Join и Distinct - PullRequest
       47

QueryOver с Join и Distinct

7 голосов
/ 25 мая 2011

Я использую следующее QueryOver:

var query = searchTermRepository.GetAllOver()
     .Where(Restrictions.On<Entities.SearchTerm>(c => c.Text).IsLike(filter.Value, MatchMode.Start))
     .Select(Projections.Distinct(Projections.Property<Entities.SearchTerm>(x => x.Contact)))
     .Inner.JoinQueryOver(x => x.Contact).Take(100);

Это создает:

SELECT distinct TOP ( 100 /* @p0 */ ) this_.ContactId as y0_
FROM   SearchTerm this_
       inner join Contact contact1_
         on this_.ContactId = contact1_.Id
       left outer join Company contact1_1_
         on contact1_.Id = contact1_1_.Id
       left outer join Person contact1_2_
         on contact1_.Id = contact1_2_.Id
       left outer join Branch contact1_3_
         on contact1_.Id = contact1_3_.Id
       left outer join ContactGroup contact1_4_
         on contact1_.Id = contact1_4_.Id
WHERE  this_.Text like 'koc%%' /* @p1 */

Но я хочу

SELECT distinct TOP ( 100 /* @p0 */ )  this_.ContactId as y0_, contact1_.*
FROM   SearchTerm this_
       inner join Contact contact1_
         on this_.ContactId = contact1_.Id
       left outer join Company contact1_1_
         on contact1_.Id = contact1_1_.Id
       left outer join Person contact1_2_
         on contact1_.Id = contact1_2_.Id
       left outer join Branch contact1_3_
         on contact1_.Id = contact1_3_.Id
       left outer join ContactGroup contact1_4_
         on contact1_.Id = contact1_4_.Id
WHERE  this_.Text like 'koc%%' /* @p1 */

Я хочу выбрать все Свойства контакта.

С наилучшими пожеланиями, Томас

Ответы [ 3 ]

9 голосов
/ 25 мая 2011

Вы должны явно указать все столбцы, которые вы хотите проецировать. Я не знаю, как это обойти.

Вот быстрый код, который использует QueryOver:

Contact contact = null;

Session
.QueryOver(() => contact)
.SelectList(list => list
    .Select(Projections.Distinct(Projections.Property(x => x.Contact))) 
    .Select(c => c.Id).WithAlias(() => contact.Id)
    .Select(c => c.FirstName).WithAlias(() => contact.FirstName)
... and so on

Затем вам нужно будет преобразовать это в ваш объект с помощью преобразователя AliasToBean.

0 голосов
/ 31 мая 2017

Предыдущий код здесь не помог мне ..

У меня была проблема с этим, а также.Во-первых, Distinct работает, но только после вызова метода QueryOver.List.ToList (), так что query.skip не будет работать должным образом, просматривая дубликаты, создавая список, а затем уменьшая количество разбитых страниц из-за дубликатов.

Самым простым, что я нашел, было сделать ... просто сначала создать список уникальных идентификаторов, а затем разбить их на сами идентификаторы.

Затем в наборе результатов вы можете просто выполнитьИдентификатор и извлекайте идентификаторы только в новом наборе результатов идентификаторов с разбивкой по страницам.

//Create your query as usual.. apply criteria.. do what ever you want.

//Get a unique set of ids from the result set.
var idList = query.
.Select(x => x.Id)
.List<long>().Distinct().ToList();

//Do your pagination here over those ids
List<long> pagedIds = idList.Skip(0).Take(10).ToList();

//Here what used to be non distinct resultset, now is..
List<T> resultquery.Where(() => 
item.Id.IsIn(pagedIds))
.List<Person>()
.ToList();

Особая благодарность .. https://julianjelfs.wordpress.com/2009/04/03/nhibernate-removing-duplicates-combined-with-paging/

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

Вы не проецируете все свойства контакта и должны быть.Я не знаю, есть ли краткий способ сказать "все свойства в контакте" или вам просто нужно делать по одному, но сейчас вы просто говорите "отличный топ 100 searchterm.contactid"

...