2011-05-25 73 views
7

我用後續QueryOver: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 */ 

我想選擇聯繫人的所有屬性。

最好的問候,托馬斯

回答

9

您必須明確指定您要投影的所有列。這是我無法解決的,我知道。

下面是一些簡單的代碼把我的頭,使用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

不要忘記「排序依據」,這對於不同的查詢必不可少 – Anton 2017-08-09 10:47:59

0

你並沒有預測所有的聯繫的屬性,應該是。我不知道是否有一種簡短的方式來說「聯繫的所有屬性」,或者你只需​​要一次做一個,但現在你只是說「不同的前100名searchterm.contactid」

0

此處列出的代碼不幫我..

我對此也有疑問。首先Distinct確實起作用,但是隻有在QueryOver.List.ToList()方法被調用之後,所以query.skip才能正常工作,對重複項進行分頁,創建列表,然後由於重複項而減少了我的分頁量。

最簡單的事情,我發現要做的就是簡單地..首先創建唯一ID的列表,然後做你的分頁上的IDS本身..

然後在您的結果集,你可以簡單地進行標識和檢索僅在您新分頁的ID結果集中使用ID。

//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/