2011-01-04 11 views
6

Tengo una consulta que utiliza para trabajar en NHibernate LINQ 2.1.2 pero es tirar NotSupportedException con NH3:NHibernate 3 LINQ combinación interna problema con tres saltos: 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; 

Las relaciones son como:

  • Referencias de flores Stem
  • madre hasMany Flores
  • Leaf Stem Referencias
  • Tallo HasMany Hojas

La excepción se arroja desde la línea 204 en NHibernate.Linq.Visitors.QueryModelVisitor. Este es el método a partir del código fuente:

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); 
    } 

Me parece el mismo tema se discute bajo el siguiente hilo:

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

Bajo ese hilo Stefan menciona que la sintaxis no es compatible :

el proveedor de LINQ espera que la expresión sea :

QuerySourceReferenceExpression. Miembro

Sin embargo, en el caso de de brw en loan.Application.Borrowers que es:

QuerySourceReferenceExpression. Miembro . Miembro

Es definitivamente una característica no admitida.

Entonces, ¿esta sintaxis se va a admitir en cualquier momento en NH3 LINQ? Creo que es una sintaxis trivial y es bueno tenerla.

Sin embargo, puedo ir a este problema volviendo a escribir la consulta como:

 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; 

Por cierto, alguien tiene una mejor solución?

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

Respuesta

1

Después de todo ese esfuerzo realizado, su pregunta:

se esta sintaxis va a ser apoyados en cualquier momento en NH3 LINQ?

... simplemente no se puede responder en este foro. NHibernate no es un producto comercial con una hoja de ruta. No puede simplemente publicar aquí y esperar que uno de los desarrolladores voluntarios responda.

Recuerda que NHibernate es de código abierto, por lo que la comunidad (¡incluyéndote a ti!) Posee problemas como este.

He estado siguiendo la lista nhibernate-development, y parece que el proveedor LINQ es un área de trabajo importante. Sin embargo, no sé si se tratará su problema específico. La mejor forma de aumentar las posibilidades de que se solucione este problema es presentar un error en el NHibernate JIRA junto con un caso de prueba que muestra el problema.

Si no parece que se tratará su problema específico, ¿por qué no download the source code y trate de solucionarlo usted mismo, y/o discutirlo más a fondo en la lista de correo? Si descarga el código fuente y trabaja un poco con él, también encontrará muchos casos de prueba de ejemplo que puede usar como ejemplos cuando presenta el error.

+0

Cuidado para explicar el -1? Ofrecí sugerencias útiles sobre cómo el problema podría terminar obteniendo visibilidad y/o finalmente resolverse. El hecho de que sea la respuesta que no quieres escuchar no significa que deba rechazarse. ;-) – mpontillo

+3

recibe mi voto. Muchas personas de .Net piensan que OSS es lo mismo que las aplicaciones comerciales, y nunca piensan en cómo pueden contribuir ellos mismos. (Aunque, dicho esto, incluso como un desarrollador experimentado, el código base de NH es intimidante) –

+1

Acabo de encontrar [este artículo] (http://nhforge.org/blogs/nhibernate/archive/2008/10/04/the-best- way-to-solve-nhibernate-bugs-submit-good-unit-test.aspx) que podría ser útil al seguir este camino. – mpontillo

1

no hemos probado el ejemplo exacto, pero tuve un problema similar en NH 3.2 y encontró que se ha resuelto en NH 3.3

Cuestiones relacionadas