我有一个消息列表。在每条消息中,都有一个响应类型列表。我需要以这样的方式提取查询:消息按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
现在,我可以按顺序获取消息,但响应类型的顺序与数据库的顺序无关。如何对响应类型进行子排序?
答案 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
类型的元素,并填充导航属性。