У меня есть запрос, который работал в NHibernate LINQ 2.1.2, но он генерирует исключение NotSupportedException с NH3:
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;
Отношения имеют вид:
- Ссылки на цветыСтебель
- Стебель Цветы HasMany
- Ссылки на листья Стебель
- Стебель Листья HasMany
Исключение выдается из строки 204 в NHibernate.Linq.Visitors.QueryModelVisitor.Вот метод из исходного кода:
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);
}
Мне кажется, что та же проблема обсуждается в следующей теме:
http://groups.google.com/group/nhusers/browse_thread/thread/dbceb7eb1e31f027/f8e69671b750e0d6?lnk=gst&q=NotSupportedException+stefan#f8e69671b750e0d6
В этой темеСтефан упоминает, что синтаксис не поддерживается:
Поставщик LINQ ожидает, что выражение будет:
QuerySourceReferenceExpression.Элемент
Однако, в случае от brw в заем. Приложение. Заемщики это:
QuerySourceReferenceExpression.УчастникЭлемент
Так что это определенно неподдерживаемая функция.
Итак, будет ли этот синтаксис поддерживаться в любое время в NH3 LINQ?Я думаю, что это тривиальный синтаксис, и его хорошо иметь.
Однако я могу обойти эту проблему, переписав запрос следующим образом:
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;
Кстати, у кого-то лучшеОбходной путь?
Ссылка nhusers: http://groups.google.com/group/nhusers/browse_thread/thread/334a53c749b0b377