Проблема внутреннего соединения NHibernate 3 LINQ с тремя переходами: NotSupportedException

У меня есть запрос, который раньше работал в NHibernate LINQ 2.1.2, но он генерирует исключение NotSupportedException с NH3:

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

Связи такие:

  • Цветочные ссылки Стержень
  • Стебель имеет много цветов
  • Листовые ссылки Стержень
  • Stem HasMany Leaves

Исключение создается из строки 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 & выражение должно быть:

QuerySourceReferenceExpression. Член

Однако в случае с brw в кредит.Приложение.Заемщики это:

QuerySourceReferenceExpression. Член. Участник

Значит, это определенно неподдерживаемый feature.

Итак, будет ли этот синтаксис когда-либо поддерживаться в NH3 LINQ? Я думаю, что это тривиальный синтаксис, и его хорошо иметь.

Однако я могу обойти эту проблему, переписав запрос следующим образом:

        IQueryable query = from stem in  GetSession().Query()
                                 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

6
задан kaptan 5 January 2011 в 18:36
поделиться