对子集进行排序



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

现在,我可以按顺序获得消息,但响应类型是按照数据库拥有它们的任何顺序。如何对响应类型进行子排序?

我想你要找的是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); }
   }
}

还是我还没有注意到问题?

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)在输出List<Message>上使用Linq to Objects对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的元素,并填充了navigation属性。

相关内容

  • 没有找到相关文章