2010-01-28 6 views
1

J'ai l'entité A qui a un IList de B appelé Bs et B a un IList de C appelé Cs.LINQ to NHibernate ne peut pas accéder aux enfants

Je veux rechercher tous les A qui ont au moins 5 C en eux. Je suis donc allé et écrit

using (var s = this._sessionFactory.OpenSession()) 
{ 
    IQueryable<A> q = s.Linq<A>(); 
    // some code... 
    if (range.Min.HasValue)      
     q = q.Where(a => a.Bs.Sum(b => b.Cs.Count) >= range.Min.Value); 
    // some code... 
    return q.Select(b=>b).ToArray(); 
} 

Cependant lors de l'exécution du code (et ayant min spécifié dans la variable de gamme) Je reçois l'exception suivante:

NHibernate.QueryException: ne pouvait pas résoudre la propriété: Cs de: A Pourquoi recherche-t-il la propriété B sur A? Les applications semblent avoir raison si:

Le (courant) cartographie sur A dit:

//... 
HasMany(a => a.Bs) 
.Table("Bs") 
.KeyColumn("IdA") 
.Cascade.AllDeleteOrphan() 
.Inverse() 
.Not.LazyLoad(); 
//... 

et sur la cartographie sur B dit:

//... 
HasMany(b => b.Cs) 
.Table("Cs") 
.KeyColumn("IdB") 
.Cascade.AllDeleteOrphan() 
.Inverse() 
.Not.LazyLoad(); 
References(b => b.A, "IdA") 
.Not.LazyLoad(); 
//... 

enfin sur la mise en correspondance sur C:

References(c => c.B, "IdB").Not.LazyLoad(); 
+3

Vous pouvez aussi essayer le nouveau fournisseur Linq dans le coffre NHibernate. Le fournisseur NHContrib Linq a des fonctionnalités plus limitées. –

+0

J'ai le dernier fournisseur LINQ du tronc NHibernate et il ne résout pas mon problème: (((( –

Répondre

1

Vous ne pouvez pas le faire avec LINQ to NHibernate 2.x

1

LINQ to NHibernate est idéal pour simplifier les requêtes simples. Cependant, lorsque vous avez besoin de faire des requêtes complexes (comme celle-ci), il est souvent préférable de passer aux critères API ou HQL. Vous avez 3 méthodes d'interrogation à votre disposition, utilisez-les toutes. Cela étant dit, une fois que NHibernate 3.0 sera disponible, il sera peut-être possible de faire cette requête en utilisant LINQ.

+0

Donc, je comprends que ce n'est pas encore possible avec le dernier fournisseur LINQ publié pour NHibernate .. –