【问题标题】:NHibernate 3 LINQ inner join issue with three jumps: NotSupportedExceptionNHibernate 3 LINQ 内部连接问题与三个跳转:NotSupportedException
【发布时间】:2011-01-04 22:20:44
【问题描述】:

我有一个曾经在 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 。会员

但是,在 from 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;

顺便说一句,有人有更好的解决方法吗?

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

【问题讨论】:

    标签: linq nhibernate join notsupportedexception


    【解决方案1】:

    在付出了所有努力之后,您的问题:

    这个语法会被支持吗 NH3 LINQ 中的任何时间?

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

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

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

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

    【讨论】:

    • 想解释一下 -1 吗?我就问题如何最终获得可见性和/或最终解决提供了有用的建议。仅仅因为这是您不想听到的答案并不意味着它应该被否决。 ;-)
    • 你得到我的投票。很多 .Net 人认为 OSS 和商业应用程序一样,从来没有考虑过如何为自己做出贡献。 (尽管如此,即使作为经验丰富的开发人员,NH 代码库也令人生畏)
    • 刚刚找到this article,这在沿着这条路走下去可能会有所帮助。
    • 我不知道 -1 但我给了你一个 +1。你的解释是有道理的,我认为它对其他读者也很有用。我不能只将其标记为答案,因为我真正想要的是一种更好的解决方法来解决这个问题。我应该以更好的方式来组织我的问题,以便更清楚。
    【解决方案2】:

    尚未测试您的确切示例,但我在 NH 3.2 中遇到了类似问题,发现该问题已在 NH 3.3 中解决

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-18
      • 1970-01-01
      • 1970-01-01
      • 2011-05-22
      相关资源
      最近更新 更多