NHibernate 3 LINQ内连接问题有三个跳转:NotSupportedException

kap*_*tan 6 linq nhibernate join notsupportedexception

我有一个以前在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;
Run Code Online (Sandbox Code Playgroud)

关系如下:

  • 花参考茎
  • 干HasMany花
  • 叶参考词干
  • 干HasMany叶子

从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);
    }
Run Code Online (Sandbox Code Playgroud)

在我看来,在以下线程中讨论了同样的问题:

http://groups.google.com/group/nhusers/browse_thread/thread/dbceb7eb1e31f027/f8e69671b750e0d6?lnk=gst&q=NotSupportedException+stefan#f8e69671b750e0d6

在该线程下,Stefan提到不支持语法:

LINQ提供程序期望表达式为:

QuerySourceReferenceExpression.会员

但是,在来自brw in loan.Application.Borrowers的情况下,它是:

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;
Run Code Online (Sandbox Code Playgroud)

顺便说一下,谁有更好的解决方法?

nhusers链接:http://groups.google.com/group/nhusers/browse_thread/thread/334a53c749b0b377

mpo*_*llo 1

付出所有努力后,你的问题是:

NH3 LINQ 是否随时支持此语法?

……这个论坛根本无法回答。NHibernate 不是一个有路线图的商业产品。您不能只是在这里发帖并希望其中一位志愿者开发人员做出回应。

请记住,NHibernate 是开源的,因此社区(包括您!)拥有此类问题。

我一直在关注nhibernate 开发列表,看起来 LINQ 提供程序是一个主要工作领域。但是,我不知道您的具体问题是否会得到解决。增加解决此问题的机会的最佳方法是在 NHibernate JIRA中提交错误以及显示问题的测试用例。

如果您的具体问题看起来没有得到解决,为什么不下载源代码并尝试自己修复它,和/或在邮件列表上进一步讨论它?如果您下载源代码并稍微使用它,您还会发现它有很多很棒的示例测试用例,您可以在提交错误时将其用作示例。

  • 你得到我的投票。许多 .Net 人将 OSS 视为商业应用程序,并且从未考虑过他们如何贡献自己。(尽管如此,即使作为一名经验丰富的开发人员,NH 代码库也令人生畏) (3认同)