如何使用Linq提供程序在NHibernate 3中使用OrderBy子集合属性?

mar*_*sks 3 .net c# nhibernate

我正在尝试按子集合的属性创建查询.在SQL中很容易:

Select Table1.*
From Table1
Inner join Table2 on Table1.Id = Table2.Table1Id
OrderBy Table1.Column1, Table2.Column1
Run Code Online (Sandbox Code Playgroud)

这是我在NHibernate 2中的表现,它工作得很好:

var result = Session.Linq<Table1>()
                 .OrderBy(x => x.Column1)
                     .ThenBy(x => x.Table2.FirstOrDefault().Column1);
Run Code Online (Sandbox Code Playgroud)

迁移到NHibernate 3后,这不再起作用了.它抛出NHibernate.Hql.Ast.ANTLR.QuerySyntaxException:Antlr.Runtime.NoViableAltException.

我正在使用NHibernate 3.1.这种查询还有其他解决方案吗?

Dav*_*emp 5

这两个查询不一样.LINQ版本(大致)等同于:

SELECT Table1.*
FROM Table1
    INNER JOIN (SELECT TOP 1 * FROM Table2 WHERE Table2.Table1ID = Table1.Id) AS FirstTable2
ORDER BY Table1.Colum1, FirstTable2.Table2
Run Code Online (Sandbox Code Playgroud)

编辑

如果你想复制原始的sql,你可能需要这样的东西:

Session.Linq<Table1>()
    .SelectMany(t1 => t1.Table2, (t1,t2) => new { t1, t2 })
    .OrderBy(t1t2 => t1t2.t1.Column1)
    .ThenBy(t1t2 => t1t2.t2.Column2)
    .Select(t1t2 => t1)
Run Code Online (Sandbox Code Playgroud)