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 提供程序期望表达式为:

查询源引用表达式。成员

但是,对于 from brw in loan.Application.Borrowers 它是:

查询源引用表达式。成员 。成员

所以这绝对是一个不受支持的功能。

那么,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 不是带有路线图的商业产品。您不能只在此处发帖并希望其中一位志愿者开发人员做出回应。

请记住,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 回答