2012-06-27 3 views
0

Я пытаюсь выполнить поиск с использованием QueryOver, однако возвращенные результаты, хотя и правильные на основе критериев поиска, дублируются.QueryOver Select возвращает больше результатов, чем Count

Вот код, я использую для подсчета результатов, который работает правильно

// disjunction to find query string in note text of tag list 
var disjunction = new Disjunction(); 
disjunction.Add(Restrictions.On<Note>(e => e.Text).IsInsensitiveLike(query)); 

var tagSubQuery = QueryOver.Of<Note>().JoinQueryOver(x => x.Tags).Where(x => x.Text.IsInsensitiveLike(query)).Select(x => x.Id); 
disjunction.Add(Subqueries.WhereProperty<Note>(x => x.Id).In(tagSubQuery)); 

// find notes between dates and based on disjunction 
var notes = this.DataOver.Where(x => x.CreatedUTC >= startDate && x.CreatedUTC <= endDate).Where(disjunction); 

// only show notes within permitted accounts 
var subnotes = QueryOver.Of<Note>().JoinQueryOver(x => x.Accounts).Where(x => x.Company.Id == user.Company.Id).Select(x => x.Id); 
var returned = notes.WithSubquery.WhereProperty(x => x.Id).In(subnotes); 

return returned.RowCount(); 

Если изменить последнюю строку в отборное заявление с пропуском и принимать как так

return returned.OrderBy(x => x.CreatedUTC).Desc.Skip(skip).Take(take).List<Note>(); 

Тогда Я получаю 3 примечания назад, вместо 2. 1 примечание дублируется, в то время как другое нормально. Я могу только предположить, что это потому, что запрос соответствовал двум тегам, связанным с одной записью.

SQL, выводимый NHibernate профилировщика следующим образом

SELECT TOP (20 /* @p0 */) this_.Id   as Id47_1_, 
       this_.CreatedGMT as CreatedGMT47_1_, 
       this_.CreatedLocal as CreatedL3_47_1_, 
       this_.CreatedUTC as CreatedUTC47_1_, 
       this_.UpdatedGMT as UpdatedGMT47_1_, 
       this_.UpdatedLocal as UpdatedL6_47_1_, 
       this_.UpdatedUTC as UpdatedUTC47_1_, 
       this_.CreatedBy as CreatedBy47_1_, 
       this_.UpdatedBy as UpdatedBy47_1_, 
       this_.Text   as Text47_1_, 
       this_.UserId  as UserId47_1_, 
       this_.Suppress  as Suppress47_1_, 
       tags2_.NoteId  as NoteId3_, 
       tag3_.Id   as TagId3_, 
       tag3_.Id   as Id27_0_, 
       tag3_.CreatedGMT as CreatedGMT27_0_, 
       tag3_.CreatedLocal as CreatedL3_27_0_, 
       tag3_.CreatedUTC as CreatedUTC27_0_, 
       tag3_.UpdatedGMT as UpdatedGMT27_0_, 
       tag3_.UpdatedLocal as UpdatedL6_27_0_, 
       tag3_.UpdatedUTC as UpdatedUTC27_0_, 
       tag3_.CreatedBy as CreatedBy27_0_, 
       tag3_.UpdatedBy as UpdatedBy27_0_, 
       tag3_.Text   as Text27_0_ 
FROM [dev.Client].[dbo].Note this_ 
     left outer join [dev.Client].[dbo].TagToNote tags2_ 
     on this_.Id = tags2_.NoteId 
     left outer join [dev.Client].[dbo].Tag tag3_ 
     on tags2_.TagId = tag3_.Id 
WHERE this_.Id in (SELECT this_0_.Id as y0_ 
        FROM [dev.Client].[dbo].Note this_0_ 
          inner join [dev.Client].[dbo].NoteToAccount accounts3_ 
          on this_0_.Id = accounts3_.NoteId 
          inner join [dev.Client].[dbo].Account account1_ 
          on accounts3_.ClientAccountId = account1_.Id 
        WHERE this_0_.Id in (SELECT this_0_0_.Id as y0_ 
              FROM [dev.Client].[dbo].Note this_0_0_ 
              WHERE (this_0_0_.CreatedUTC >= '2012-06-01T00:00:00.00' /* @p1 */ 
                and this_0_0_.CreatedUTC <= '2012-06-30T00:00:00.00' /* @p2 */) 
               and (lower(this_0_0_.Text) like '%dtes%' /* @p3 */ 
                 or this_0_0_.Id in (SELECT this_0_0_0_.Id as y0_ 
                      FROM [dev.Client].[dbo].Note this_0_0_0_ 
                        inner join [dev.Client].[dbo].TagToNote tags3_ 
                        on this_0_0_0_.Id = tags3_.NoteId 
                        inner join [dev.Client].[dbo].Tag tag1_ 
                        on tags3_.TagId = tag1_.Id 
                      WHERE lower(tag1_.Text) like '%dtes%' /* @p4 */))) 
          and account1_.CompanyId = 1 /* @p5 */) 
ORDER BY this_.CreatedUTC desc 

Если я ставлю это прямо в студии управления SQL возвращает 3 результаты, два из которых являются одинаковыми.

ответ

1

Это из-за левого соединения, которое вызывает декартово произведение. Вы должны применять DistinctRootTransformer путем добавления этого:

.TransformUsing (Transformers.DistinctRootEntity)

+0

Я не 100%, когда дело доходит до отношений, но это, казалось, сделать трюк. Спасибо! – JConstantine

Смежные вопросы