我有一个以前在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);
}
在我看来,在以下主题下讨论了同样的问题:
在该线程下,Stefan提到不支持语法:
LINQ提供商期望 表达式为:
QuerySourceReferenceExpression。构件
然而,在brw in的情况下 loan.Application.Borrowers it:
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
答案 0 :(得分:1)
在完成所有努力之后,你的问题是:
是否支持此语法 在NH3 LINQ的任何时间?
...在这个论坛上根本无法回答。 NHibernate不是具有路线图的商业产品。你不能只是在这里发帖,并希望其中一位志愿开发者做出回应。
请记住,NHibernate是开源的,所以社区(包括你!)拥有这样的问题。
我一直在关注nhibernate-development列表,看起来LINQ提供程序是一个主要的工作领域。但是,我不知道您的具体问题是否会得到解决。增加修复此问题的可能性的最佳方法是在NHibernate JIRA中提交一个错误以及显示问题的测试用例。
如果看起来不符合您的具体问题,为什么不download the source code并尝试自行修复,和/或在邮件列表中进一步讨论?如果您下载源代码并稍微使用它,您还会发现它有很多很好的示例测试用例,您可以在提交错误时将其用作示例。
答案 1 :(得分:1)
没有测试过您的确切示例,但我在NH 3.2中遇到了类似的问题,发现在NH 3.3中已经解决了