6

NHibernate LINQ 2.1.2 で動作していたクエリがありますが、NH3 で 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;

関係は次のようになります。

  • 花のリファレンスステム
  • 茎には多くの花があります
  • リーフ リファレンス ステム
  • 茎は多くの葉を持っています

NHibernate.Linq.Visitors.QueryModelVisitor の 204 行目から例外がスローされます。ソースコードからのメソッドは次のとおりです。

    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

そのスレッドの下で、Stefan は構文がサポートされていないと述べています。

LINQ プロバイダーは、式が次のようになることを想定しています。

QuerySourceReferenceExpression 。メンバー

ただし、loan.Application.Borrowers の from 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

4

2 に答える 2

1

すべての努力を払った後、あなたの質問:

この構文は NH3 LINQ でいつでもサポートされる予定ですか?

... このフォーラムでは答えられません。NHibernate は、ロードマップのある商用製品ではありません。ここに投稿して、ボランティア開発者の 1 人が応答することを期待することはできません。

NHibernate はオープン ソースであるため、コミュニティ (あなたを含む) がこのような問題を所有していることを忘れないでください。

私はnhibernate-developmentリストをフォローしてきましたが、LINQ プロバイダーが主要な作業領域のようです。ただし、特定の問題が解決されるかどうかはわかりません。この問題が修正される可能性を高める最善の方法は、問題を示すテスト ケースと共にNHibernate JIRAにバグを報告することです。

特定の問題が解決されないように見える場合は、ソース コードをダウンロードして自分で修正してみたり、メーリング リストでさらに議論したりしてみませんか? ソース コードをダウンロードして少し操作すると、バグを報告するときにサンプルとして使用できる優れたテスト ケースの例がたくさんあることがわかります。

于 2011-02-05T04:23:48.070 に答える
1

正確な例をテストしていませんが、NH 3.2 で同様の問題があり、NH 3.3 で解決されていることがわかりました

于 2012-05-29T21:09:48.783 に答える