2011-01-04 6 views
6

Ho una domanda che lavorava in NHibernate LINQ 2.1.2 ma sta gettando NotSupportedException con NH3:NHibernate 3 LINQ join interno edizione con tre salti: NotSupportedException

IQueryable<Tree> query = from flower in GetSession().Query<Flower>() 
          from leaf in flower.Stem.Leaves // <--- the problem is here with three jumps 
          where leaf.Color == Green 
          select flower; 

Le relazioni sono come:

  • Riferimenti fiore stelo
  • staminali hasMany Fiori
  • Foglia Riferimenti Stem
  • Stem HasMany Leaves

L'eccezione viene generata dalla riga 204 in NHibernate.Linq.Visitors.QueryModelVisitor. Ecco il metodo dal codice sorgente:

public override void VisitAdditionalFromClause(AdditionalFromClause fromClause, QueryModel queryModel, int index) 
    { 
     if (fromClause is LeftJoinClause) 
     { 
      // It's a left join 
      _hqlTree.AddFromClause(_hqlTree.TreeBuilder.LeftJoin(
           HqlGeneratorExpressionTreeVisitor.Visit(fromClause.FromExpression, VisitorParameters).AsExpression(), 
           _hqlTree.TreeBuilder.Alias(fromClause.ItemName))); 
     } 
     else if (fromClause.FromExpression is MemberExpression) 
     { 
      var member = (MemberExpression) fromClause.FromExpression; 

      if (member.Expression is QuerySourceReferenceExpression) 
      { 
       // It's a join 
       _hqlTree.AddFromClause(_hqlTree.TreeBuilder.Join(
            HqlGeneratorExpressionTreeVisitor.Visit(fromClause.FromExpression, VisitorParameters).AsExpression(), 
            _hqlTree.TreeBuilder.Alias(fromClause.ItemName))); 
      } 
      else 
      { 
       // What's this? 
       throw new NotSupportedException(); // <--------- LINE 204 
      } 
     } 
     else 
     { 
      // TODO - exact same code as in MainFromClause; refactor this out 
      _hqlTree.AddFromClause(_hqlTree.TreeBuilder.Range(
           HqlGeneratorExpressionTreeVisitor.Visit(fromClause.FromExpression, VisitorParameters), 
           _hqlTree.TreeBuilder.Alias(fromClause.ItemName))); 

     } 

     base.VisitAdditionalFromClause(fromClause, queryModel, index); 
    } 

Ritengo stesso problema è discusso sotto thread:

http://groups.google.com/group/nhusers/browse_thread/thread/dbceb7eb1e31f027/f8e69671b750e0d6?lnk=gst&q=NotSupportedException+stefan#f8e69671b750e0d6

In quel filo Stefan menziona che la sintassi non è supportata :

il provider LINQ aspetta l'espressione di essere:

0.123.

QuerySourceReferenceExpression. Gli

Tuttavia, nel caso di da BRW in loan.Application.Borrowers che è:

QuerySourceReferenceExpression. Membro . Membro

Quindi è sicuramente una funzione non supportata .

Quindi, questa sintassi verrà supportata in qualsiasi momento in NH3 LINQ? Penso che sia una sintassi banale ed è bello avere.

Tuttavia posso andare in giro questo problema riscrivendo la query come:

 IQueryable<Tree> query = from stem in GetSession().Query<Stem>() 
           from leaf in stem.Leaves 
           from flower in stem.Flowers 
           where leaf.Color == Green 
           select flower; 

A proposito, qualcuno ha una soluzione migliore?

nhusers dei collegamenti: http://groups.google.com/group/nhusers/browse_thread/thread/334a53c749b0b377

risposta

1

Dopo tutto quello sforzo messo in, la tua domanda:

è questa sintassi intenzione di essere supportati in qualsiasi momento in NH3 LINQ?

... semplicemente non si può rispondere in questo forum. NHibernate non è un prodotto commerciale con una roadmap. Non puoi semplicemente postare qui e spero che uno degli sviluppatori volontari risponda.

Ricorda che NHibernate è open source, quindi la community (incluso te!) Possiede problemi come questo.

Ho seguito l'elenco nhibernate-development e sembra che il provider LINQ sia un'area di lavoro importante. Tuttavia, non so se il tuo problema specifico verrà risolto. Il modo migliore per aumentare le probabilità che questo problema venga risolto è quello di archiviare un bug in NHibernate JIRA insieme a un caso di test che mostri il problema.

Se non sembra che il problema specifico venga risolto, perché non lo è download the source code e provare a risolverlo da solo e/o discuterlo ulteriormente sulla mailing list? Se scarichi il codice sorgente e lavori un po 'con esso, scoprirai anche che ci sono un sacco di esempi di casi di esempio che puoi usare come esempi quando inserisci il bug.

+0

cura di spiegare il -1? Ho offerto suggerimenti utili su come il problema potrebbe finire per ottenere visibilità e/o alla fine risolti. Solo perché è la risposta che non vuoi sentire, non significa che debba essere votata. ;-) – mpontillo

+3

hai il mio voto. Un sacco di persone .Net pensano all'OSS uguale alle app commerciali e non pensano mai a come possono contribuire autonomamente. (Anche se, come detto, anche se uno sviluppatore esperto, il codice di NH si sta intimidendo) –

+1

Appena trovato [questo articolo] (http://nhforge.org/blogs/nhibernate/archive/2008/10/04/the-best- way-to-solve-nhibernate-bugs-submit-good-unit-test.aspx) che potrebbe essere utile quando si scende a questa strada. – mpontillo

1

non ho ancora testato il tuo esempio esatta, ma ho avuto un problema simile in NH 3.2 e ha scoperto che si è stato risolto in NH 3.3