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