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 。メンバー
ただし、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