NHibernate 3 LINQ проблема внутреннего соединения с тремя прыжками: NotSupportedException - PullRequest
6 голосов
/ 05 января 2011

У меня есть запрос, который работал в 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

Ответы [ 2 ]

1 голос
/ 30 мая 2012

Не проверял ваш точный пример, но у меня была похожая проблема в NH 3.2, и я обнаружил, что она была решена в NH 3.3

1 голос
/ 05 февраля 2011

После всех этих усилий ваш вопрос:

будет ли этот синтаксис поддерживаться в любое время в NH3 LINQ?

... просто невозможно ответить на этом форуме. NHibernate не является коммерческим продуктом с дорожной картой. Вы не можете просто написать здесь и надеяться, что один из разработчиков-добровольцев ответит.

Помните, что NHibernate является открытым исходным кодом, поэтому сообщество (включая вас!) Владеет такими проблемами.

Я следил за списком nhibernate-development , и похоже, что поставщик LINQ является основной областью работы. Однако я не знаю, будет ли решена ваша конкретная проблема. Лучший способ повысить вероятность исправления этой проблемы - отправить сообщение об ошибке в NHibernate JIRA вместе с тестовым примером, показывающим проблему.

Если не похоже, что ваша конкретная проблема будет решена, почему бы не скачать исходный код и попытаться исправить его самостоятельно и / или обсудить его далее в списке рассылки? Если вы скачаете исходный код и немного поработаете с ним, вы также обнаружите, что в нем есть множество отличных примеров тестов, которые вы можете использовать в качестве примеров при регистрации ошибки.

...