EntityFramework对子集进行排序

时间:2013-01-18 17:16:44

标签: linq entity-framework linq-to-entities

我有一个消息列表。在每条消息中,都有一个响应类型列表。我需要以这样的方式提取查询:消息按ID排序,响应类型也按ID排序。它们不是按数据库中的ID排序的。

messageResponse.Messages = (from m in db.Messages.Include("ResponseType")
    .SomeMagicSubSortThing("ResponseType.ID")
    select m).OrderBy(m1 => m1.ID).ToList<Message>();

这应该导致:

Message   ID    Col1    Col2
-- ResponseType  ID    Col1    Col2

......就像这样:

1     MessageA    MessageB
--  1   ResponseTypeC    ResponseTypeD
--  2   ResponseTypeQ    ResponseTypeR
--  3   ResponseTypeX    ResponseTypeZ
--  4   ResponseTypeL    ResponseTypeM

2     MessageE    MessageF
--  1   ResponseTypeG    ResponseTypeH
--  2   ResponseTypeI    ResponseTypeJ
--  3   ResponseTypeB    ResponseTypeS
--  4   ResponseTypeL    ResponseTypeC

现在,我可以按顺序获取消息,但响应类型的顺序与数据库的顺序无关。如何对响应类型进行子排序?

2 个答案:

答案 0 :(得分:1)

我认为你在寻找的是ThenBy():

messageResponse.Messages = (from m in db.Messages.Include("ResponseType")
.SomeMagicSubSortThing("ResponseType.ID")
select m).OrderBy(m1 => m1.ID).ThenBy(n=>n.ResponseType.ID).ToList<Message>()

<强>更新

在您的实体中,您只需定义一个计算属性,如:

class Message {
   public ICollection<Response> Responses {get; set;}
   public ICollection<Response> SoretedResponses {
       get { return this.Responses.OrderBy(n=>n.Response); }
   }
}

或者我仍然错过了这个问题?

答案 1 :(得分:0)

EF不能很好地做到这一点,但你有两个选择:


1)在Linq to Entities查询中使用Select子句:

var messages = db.Messages
  .OrderBy( o => o.ID )
  .Select( o => new
    {
      Message = o,
      ResponseTypes = o.ResponseTypes.OrderBy( x => x.ID ),
    }
  )
  .ToList()
;

这是让EF对数据库服务器上的子属性进行排序的唯一方法。
您的输出List将在Select

中包含匿名类型的元素

2)使用Linq到输出List<Message>上的对象来对ResponseType的集合进行排序:

List<Message> messages = db.Messages
  .Include( o => o.ResponseTypes )
  .OrderBy( o => o.ID )
  .ToList()
;

foreach( var message in messages )
{
  message.ResponseTypes = message.ResponseTypes.OrderBy( x => x.ID ).ToList();
}

这将获取数据库中的所有记录,然后在内存中对它们进行排序。
输出列表将包含Message类型的元素,并填充导航属性。