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