2011-03-09 120 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