List <T>的实现正在丢失原始查询的排序

get*_*ode 5 linq asp.net linq-to-entities entity-framework

使用实体框架我有IQueryable一个数据库对象,Meeting并且eDbContext.

IQueryable<Meeting> meetings = e.Meetings
    .Include(m => m.MeetingStage)
    .Include(m => m.MeetingType)
Run Code Online (Sandbox Code Playgroud)

此查询已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()));
Run Code Online (Sandbox Code Playgroud)

这里调试器的输出是:

2493 / 4228 / 7029 / 8254 / 9375 / 10563 / 11716 / 10500
2493 / 4228 / 7029 / 8254 / 9375 / 10563 / 11716 / 10500
2493 / 4228 / 7029 / 8254 / 9375 / 10500 / 10563 / 11716
Run Code Online (Sandbox Code Playgroud)

temp8中对象的顺序已更改.有谁能解释一下?

更多信息:

人们要求提供更多关于什么的信息sortedMeetings.

var sortedMeetings = meetings.DoMeetingSort(sort, ascending);
Run Code Online (Sandbox Code Playgroud)

我的扩展DoMeetingSort如下.我删除了不适用的开关案例:

    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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

get*_*ode 0

我找到了答案。我返回的对象MeetingSearchResult没有表示正在排序的列的属性,因此该列不包含在数据库查询中。我猜这是显而易见的,但让我困惑了很长时间。还解释了为什么对其他列进行排序可以正常工作。

+1 @saamorim 作为一双新鲜的眼睛,并指出我在context.Database.Log我没有意识到的地方。