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

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

Отношения такие:

  • Цветочные ссылки Стебель
  • Стебель имеет много цветов
  • Ссылки на листья
  • Стебель имеет много листьев

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

ВыражениеИсходнойСсылкиЗапроса . Участник

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

ВыражениеИсходнойСсылкиЗапроса . Член . Участник

Так что это определенно неподдерживаемая функция.

Итак, будет ли когда-либо поддерживаться этот синтаксис в 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


person kaptan    schedule 04.01.2011    source источник


Ответы (2)


После всех приложенных усилий ваш вопрос:

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

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

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

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

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

person mpontillo    schedule 05.02.2011
comment
Хотите объяснить -1? Я предложил полезные советы о том, как проблема может стать видимой и/или в конечном итоге решенной. То, что это ответ, который вы не хотите слышать, не означает, что за него нужно проголосовать. ;-) - person mpontillo; 11.02.2011
comment
ты получишь мой голос. Многие пользователи .Net думают об OSS так же, как о коммерческих приложениях, и никогда не думают о том, как они могут внести свой вклад. (Хотя при этом кодовая база NH пугает даже опытного разработчика) - person kͩeͣmͮpͥ ͩ; 07.03.2011
comment
Только что нашел эта статья, которая может быть полезна при выборе этого пути. - person mpontillo; 13.04.2011
comment
Я не знаю насчет -1, но я поставил вам +1. Ваше объяснение имеет смысл, и я думаю, что оно будет полезно и для других читателей. Я не могу просто пометить это как ответ, потому что то, что я действительно искал, - это своего рода лучший обходной путь для этой проблемы. Я должен был лучше структурировать свой вопрос, чтобы быть более ясным. - person kaptan; 07.06.2011

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

person Mike Rowley    schedule 29.05.2012