2011-03-15 14 views
3

我想創建查詢由子集合的屬性哪些訂單。它是在SQL很簡單:如何訂購在NHibernate 3中使用Linq提供程序的子集合屬性?

Select Table1.* 
From Table1 
Inner join Table2 on Table1.Id = Table2.Table1Id 
OrderBy Table1.Column1, Table2.Column1 

這裏是我做到了NHibernate的2和它工作得很好:

var result = Session.Linq<Table1>() 
       .OrderBy(x => x.Column1) 
        .ThenBy(x => x.Table2.FirstOrDefault().Column1); 

遷移到NHibernate的3此不再工作之後。它拋出NHibernate.Hql.Ast.ANTLR.QuerySyntaxException:Antlr.Runtime.NoViableAltException。

我使用的是NHibernate 3.1。有沒有其他解決方案用於這種查詢?

回答

4

這兩個查詢是不一樣的。 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 

編輯

如果要複製您可能希望像原來的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) 
+0

我的SQL的例子就是我想要的用Linq來實現,但Linq示例是一些解決方法,這在我的查詢中已經足夠了,因爲我至少需要通過一個孩子的屬性來定購。 – marisks 2011-03-15 12:26:02

+0

太棒了!謝謝!它的工作原理:)我從來沒有想過SelectMany方法。 – marisks 2011-03-17 08:26:42