gpt4 book ai didi

asp.net - List 的实现丢失了原始查询的顺序

转载 作者:行者123 更新时间:2023-12-02 15:48:29 26 4
gpt4 key购买 nike

使用 Entity Framework 我有一个用于数据库对象MeetingIQueryablee 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如下。我删除了此处不适用的开关盒:

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

最佳答案

发生这种情况的原因有很多,但从您的示例来看,最有可能的原因是底层数据库决定了这一点。我认为您的 sortedMeetings 仍然是 IQueryable,因此仍在构建查询。当您包含其他列并调用 ToList() 时,将对您的数据库引擎执行不同的查询,并且它可能决定使用另一个索引,或者只是您查询的另一个路径。如果您使用的是 Sql Server,请分析您的查询并查看执行计划,但是按照您想要的方式使用 order by,这是您唯一的保证。

但是将 sortedMeetingsOrderBy 一起呈现以进行完整分析。

编辑:

此外,来源IQueryable似乎并不相同:temp2派生drom sortedMeetingstemp4和来自 temptemp8。另外,如果您使用的是 EF6,请使用 context.Database.Log 转储查询,否则使用数据库分析器。在这里发布数据库查询,我们帮助您分析它。

关于asp.net - List<T> 的实现丢失了原始查询的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21701947/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com