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:
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
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
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) –
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