2011-03-09 126 views
1

在SQL排序我可以寫EF4 - C#中使用lambda表達式

SELECT a.*, b.* 
FROM master_table a 
LEFT JOIN detail_table b ON (b.a_id = a.id) 
ORDER BY a.id, b.order_field 

是否有可能做相同的EF4? 我無法理解如何通過子句來指定順序。 到目前爲止,我嘗試過

List<master_table> l = context.master_table.Include("detail_table"). 
OrderBy(x=>x.id). 
ThenBy(//here is the problem, y=>y.detail_table.order_filed doesn't compile, 
//y=>y.detail_tables.OrderBy(z=>z.order_field) - throws a run-time exception 
). 
ToList(); 

謝謝。

回答

3

在LINQ到實體的語法可以類似於你的SQL查詢:

var result = from a in context.master_table 
      join b in context.detail_table on a.id equals b.a_id 
      orderby a.id, b.order_field 
      select new { /*...*/}; 

編輯:

隨着澄清您的評論 - 問題是,在SQL查詢你有您正在加入的項目對(a,b) - 在Linq to Entities查詢中,您嘗試執行導航屬性的次要訂單。

所不同的是,有一個在此背景下,master_table條目和detail_table條目之間一對多的關係,您可以通過master_table入口有一個分組已經 - 因爲它沒有任何意義(編譯器或一般)能夠在detail_table級別上表達該排序順序。

我只是在枚舉結果時強制執行它 - master_table條目已經按照正確的順序,只是使用foo.detail_tables.OrderBy(x=>x.order_field)返回詳細信息。

+0

感謝您的回答,但這不完全是我想要的......我可能表達自己不清楚。我想獲得'master_table'實體的列表,包括按'order_field'排序的細節('detail_table')。也許我正在嘗試做一些不可能的事情。 – a1ex07 2011-03-09 18:49:28

+1

@ a1ex07:這個LINQ查詢如何與您的原始SQL查詢示例不匹配?它看起來像我完全匹配。 – dthorpe 2011-03-09 18:54:34

+0

感謝您的額外解釋 – a1ex07 2011-03-10 02:15:07