2

我有一个消息列表。在每条消息中,都有一个响应类型列表。我需要以这样一种方式提取查询,即消息按 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

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

4

2 回答 2

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); }
   }
}

还是我仍然错过了这个问题?

于 2013-01-18T17:32:34.987 回答
0

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


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

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 to Objects 对以下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填充了导航属性的类型元素。

于 2013-01-18T17:43:01.870 回答