我使用Entity Framework得到一个Meeting
数据库对象的IQueryable
,并且e
是DbContext
。
IQueryable<Meeting> meetings = e.Meetings
.Include(m => m.MeetingStage)
.Include(m => m.MeetingType)
这个查询已经应用了 OrderBy
。
然后我想从这个查询中选择并创建一个新的对象 MeetingSearchResult
。然而,在某些情况下,排序发生了改变,如下面的测试所示。
var temp2 = sortedMeetings.Select(m => m.MeetingID);
System.Diagnostics.Debug.WriteLine(string.Join(" / ", temp2.ToList().ToArray()));
var temp4 = sortedMeetings.Select(m => new MeetingSearchResult()
{
MeetingID = m.MeetingID,
CompanyName = m.CompanyName
});
System.Diagnostics.Debug.WriteLine(string.Join(" / ", temp4.ToList().Select(m => m.MeetingID).ToArray()));
var temp8 = sortedMeetings.Select(m => new MeetingSearchResult()
{
MeetingID = m.MeetingID,
CompanyName = m.CompanyName,
MeetingDate = m.MeetingDate,
MeetingStage = m.MeetingStage.Description
});
System.Diagnostics.Debug.WriteLine(string.Join(" / ", temp8.ToList().Select(m => m.MeetingID).ToArray()));
这里调试器的输出为:
2493 / 4228 / 7029 / 8254 / 9375 / 10563 / 11716 / 10500
2493 / 4228 / 7029 / 8254 / 9375 / 10563 / 11716 / 10500
2493 / 4228 / 7029 / 8254 / 9375 / 10500 / 10563 / 11716
temp8中对象的顺序已经改变。有人能解释一下吗?
更多信息:
有人要求关于sortedMeetings
是什么的更多信息。
var sortedMeetings = meetings.DoMeetingSort(sort, ascending);
以下是我的扩展程序DoMeetingSort
。我已经删除了不适用的switch cases:
public static IQueryable<Meeting> DoMeetingSort(this IQueryable<Meeting> query, Constants.MeetingSortColumn column, bool ascending)
{
switch (column)
{
case Constants.MeetingSortColumn.MeetingType:
return ascending
? query.OrderBy(m => m.MeetingType.Description).ThenBy(m => m.MeetingDate).ThenBy(m => m.CompanyName)
: query.OrderByDescending(m => m.MeetingType.Description).ThenByDescending(m => m.MeetingDate).ThenByDescending(m => m.CompanyName);
}
}
temp
是什么?生成了哪些查询? - Sergey BerezovskiyMeetings
表是否应用了索引?选择另一组字段可能意味着数据库使用了另一个索引,这可能意味着另一种排序。 - Andrei