【问题标题】:Does IList<> guarantee order of added items in C#IList<> 是否保证 C# 中添加项目的顺序
【发布时间】:2016-11-25 09:03:49
【问题描述】:

当使用 Update-Database 命令时,我正在使用 Configuration.cs 类的 Seed() 方法在数据库中填充数据。

除此之外,我正在创建这样的 EventCategory 对象列表:

private IList<EventCategory> CreateEventCategoriesTestDefinition()
{
    eventCategories = new List<EventCategory>();

    var eventCategoryRecruitment = new EventCategory("Recruitment");
    eventCategories.Add(eventCategoryRecruitment);

    var eventCategoryInternship = new EventCategory("Internship");
    eventCategories.Add(eventCategoryInternship);

    var eventCategoryTrainingPrograms = new EventCategory("Training Programs");
    eventCategoryTrainingPrograms.Events
        .Add(new Event("Managerial Training Program 2012-2014", eventCategoryTrainingPrograms));
    eventCategories.Add(eventCategoryTrainingPrograms);

    var eventCategoryEmployee = new EventCategory("Employee & Team Potential");
    eventCategories.Add(eventCategoryEmployee);

    return eventCategories;
}

逐个元素添加。 eventCategory 只是一个私有属性:

private IList<EventCategory> eventCategories;

Seed() 方法我调用CreateEventCategoriesTestDefinition() 几乎一切都很好,但是当我去数据库检查数据时,我注意到 EventCategory 表中的数据没有正确的顺序:

正如您在图片上看到的那样,InternshipTraining Programs 切换位置与添加 inCreateEventCategoriesTestDefinition() 方法的顺序相比。

有人知道这里发生了什么吗?为什么不保留添加顺序?我知道它应该在List&lt;&gt; 中保留,但对于IList&lt;&gt; 不一样? 或者这可能与EntityFramework有关?

【问题讨论】:

  • EF 不保证保存更改时的插入顺序。它会在它认为合适的时候从对象图中构建查询。至于IList&lt;&gt;,那只是一个接口:实现是维护或不维护顺序的实现......接口不做任何事情
  • List(实现)保证项目的顺序。我认为这个问题与 EF 有关。
  • 列表保证排序但数据库不是因为表没有隐式顺序。您需要在您的 SELECT 声明中应用 ORDER BY。如果您需要保留插入顺序,则必须将其存储在 CreatedAt datetimePosition int 等列中。然后将它们用于ORDER BY
  • 只需使 Id 列不自动递增并自己提供值(1 表示招聘等)。

标签: c# entity-framework list


【解决方案1】:

如果您依赖数据库进行排序,那么也可以。

  1. 关闭自动 ID 增量并指定您自己的 ID

    EventCategory(int id, 字符串名称)

  2. 如果您必须使用数据库标识,请尝试为您的对象使用排序顺序 (int) 列

    EventCategory(string name, int sortOrder)

无论哪种方式,您都无法保证您将获得一个已排序的列表并持久保存到数据库中。我不能在这里肯定你的用例,但你不应该回复 SQL 来为你排序你的对象,但是在查询数据库时使用 linq 在绑定到视图之前对它们进行排序。

例如

var mySortedCategories = dbContext.EventCategories.OrderBy(x => x.Name).ToList();

【讨论】:

    猜你喜欢
    • 2010-10-01
    • 2019-12-19
    • 2019-04-16
    • 2023-03-26
    • 2010-09-24
    • 2013-07-06
    • 1970-01-01
    • 2018-12-28
    • 1970-01-01
    相关资源
    最近更新 更多