2013-10-09 32 views
5

vurur.NHibernate QueryOver Bir varlığı seçin ve ilgili listeyi almak için çalışıyorum

public class UserRoleMap : ClassMap<UserRole> 
{ 
    public UserRoleMap() 
    { 
     Id(x => x.Id); 
     Map(x => x.RoleName); 
     HasManyToMany(x => x.UsersInRole) 
     .Inverse() 
     .LazyLoad() 
     .Table("UsersInRoles"); 
    } 
} 
: haritalama aşağıdaki gibidir

SELECT ... FROM UsersInRoles 
left outer join UserRoles on ... 
WHERE UserRoles.UserId=? 

: şuna benzer ki

SELECT ... FROM UserRoles 
left outer join UsersInRoles on ... 

Ve yüzlerce daha ayrı sorgular: birincisi şey gibidir

cevap

3

Bu davranışın beklememiz gereken şey olduğunu söyleyebilirim. İlk sorguda olduğunu, alır, en sistemdeki 2 kullanıcı ve 2 rolleri

User1 - Role1 // has only Role1 
User2 - Role1 // now we see that Role2 has more then User1 
User2 - Role2 

Diyelim

sahip bir senaryo, içelim sadece User1 ve onun birçok çoğa ilişki Role1. Bugün geldiğimiz noktada ISession olan tek Kullanıcı1, yani Role1 kullanıcıları'nın kümesi tamamlanmamış (şu anda ISession yüklenen nesneleri yeniden kullanamazsınız) olduğunu. Ama nerede olduğumuzu nasıl bilmeliyiz? Role1 için yüklenen tüm veriler oturumda mı yoksa oturumda mı?

Yeni sorgu, Role1 için veri yüklenmesi gerekir. Ve bu şekilde, biz sonunda

Ne ben en iyi çözüm olarak (bkz ı hemen hemen tüm senaryolar onu kullanıyorum) bu sorguları Dosens ... batch-size ayardır sahip olabilir: 19.1.5. Using batch fetching

HasManyToMany(x => x.UsersInRole) 
    ... 
    .BatchSize(25) 

Tüm koleksiyon haritalarınızı .BatchSize(25) ile işaretleyin ve bunu Sınıf haritasına da yapın. Bu daha sonra 1 SQL Script neden olur, ancak sonunda daha sonra 1 + (2-4) toplu boyutu ve sayfa boyutu bağımlı değil.

+0

Önerinizi denediniz. 1 + 12 sorguları ile sonuçlandı - daha önce daha iyi MUCH, ancak 12 daha az yapmak için bir yolu yok mu? (parti büyüklüğünü arttırmak?) - parti büyüklüğünün maliyeti nedir? Her şey iyiyse, varsayılan olarak ayarlanmış olurdum. Parti boyutu tek çözüm mü? 2 sorguyla sonuçlanan olası bir katılım yok mu? Eğer basit bir SQL ile kendi kendime yazmam gerekirse, 2 sorgunun yeterli olacağını düşünüyorum. Teşekkürler. –

+1

Toplu boyuttan daha iyi bir çözüm varsa, belki emin değilim. Bunun varsayılan olarak açılmamasının nedeni, bu durumun mantıksız bir mantığa aykırı olduğu gerçeğidir: Uninitialize nesnesinin proxy'si bir sürücüdür. Gerektiğinde kendi verileri için doğrudan gider. Parti boyutlandırma, bu SELECTS'ye katılmak için oturumda biraz daha fazla çaba harcar. Her neyse, Toplu boyut tüm * bizim * koleksiyonları ve sınıf eşleştirmeleri üzerindedir. Ve büyük setlerde bile performans inanılmaz –