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

时间:2014-02-11 12:32:54

标签: asp.net linq entity-framework linq-to-entities

使用实体框架我有IQueryable数据库对象MeetingeDbContext

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如下。我删除了不适用的开关案例:

    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);
        }
    }

2 个答案:

答案 0 :(得分:1)

有很多原因导致这种情况发生,但是从您的示例中可能最有可能是由于底层数据库决定了这一点。 我假设您的sortedMeetings仍然是IQueryable,因此查询仍在构建中。当您包含其他列并调用ToList()时,正在对您的数据库引擎执行不同的查询,并且它可能决定使用另一个索引,或者只是您查询的另一个路径。如果您正在使用Sql Server,请对您的查询进行概要分析并查看执行计划,但仍然按照您的要求使用订单,这只是您的保证。

但是将sortedMeetingsOrderBy一起展示以进行完整分析。

修改

此外,原始IQueryable似乎不一样:来自temp2的{​​{1}}派生的sortedMeetingstemp4temp8 。此外,如果您使用的是EF6,请使用temp转储查询,否则请使用数据库探查器。在这里发布数据库查询,我们帮助您分析它。

答案 1 :(得分:0)

我找到了答案。我返回的MeetingSearchResult对象没有表示要排序的列的属性,因此该列未包含在数据库查询中。很明显我猜,但让我感到困惑多年。还解释了为什么其他列的排序工作正常。

+1 @saamorim作为一双新眼睛,指着我context.Database.Log我不知道。