2011-05-25 13 views
7

ben takip QueryOver kullanmakKatılım ile QueryOver ve Farklı

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

Ama Contact tüm Özellikler seçeneğini seçin istiyorum

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

istiyorum.

Saygılarımızla, Thomas

cevap

9

Yansıtmak istediğiniz tüm sütunları açıkça belirtmeniz gerekir. Bunda bildiğim bir yolu yok.

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 

Ardından AliasToBean trafo kullanarak nesneye bu dönüşümü gerekir:

İşte QueryOver kullanır kafamın üst kapalı bazı hızlı kod. Burada bana yardım etmedi listelenmiş

+0

unutma ayrı sorgu için gerekli olan – Anton

0

Sen temas özelliklerinin tüm projelendirme öyle ve olmalıdır. "Temastaki tüm özelliklerin" söylenmesi için kısa bir yol olup olmadığını bilmiyorum, ya da sadece bir seferde yapmanız gerekiyorsa, şu anda sadece "ayrı en iyi 100 searchterm.contactid" diyorsunuz

0

Önceki kod ..

Bu aswell ile sorunu vardı. Öncelikle Distinct çalışır, ancak yalnızca QueryOver.List.ToList() yöntemi çağrıldıktan sonra, query.skip düzgün çalışmaz, çiftler üzerinde çağrı yapıp listeyi oluşturup çoğaltmaları nedeniyle disk belleği miktarımı azaltır. .

i basitçe kimlikleri kendileri üzerinde sayfalama yapmak, sonra ilk eşsiz kimlik listesini oluşturmak .. oldu yapmak bulundu

kolay şeyi .. senin sonuç sette

Sonra sadece bir kimliği gerçekleştirmek ve geri alabilirsiniz Sadece yeni paginated id sonuç kümenizde. "OrderBy" hakkında

//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(); 

özel teşekkürler için .. https://julianjelfs.wordpress.com/2009/04/03/nhibernate-removing-duplicates-combined-with-paging/