Объекты сортируются по времени неправильно после загрузки данных в таблицу SQL (Entity Framework)
У меня проблема с порядком идентификаторов в моей таблице SQL. Я создал программу, которая считывает некоторые переменные с компьютера, а затем записывает эти значения в таблицу SQL с помощью Entity Framework. Для загрузки значений используются два списка - когда первый список заполнен (например, время заполнения составляет около 10 минут) переменными, второй список (который содержит записанные переменные) загружается в таблицу SQL и очищается. Через 10 минут списки меняются.
Это работает нормально, но однажды я заметил, что некоторые строки (некоторые = 100 строк из 10000 строк) имеют "нарушенный порядок". Я имею в виду что-то вроде ниже:
ID - значение - время
1000 - 3 - 15:00
1001 - 4 - 15:01
1002 - 1 - 14:58!!
1003 - 2 - 14:59!!
1004 - 5 - 15:02
1005 - 6 - 15:03
Другими словами, есть некоторые переменные, которые иногда меняют свой порядок в таблице SQL. Тысячи строк до и после этих проблемных строк в порядке.
UPD: Как я только что выяснил, эта проблема возникает каждые 50 и 51 минута, если время (14:50: хх...15:50)... очень странно для понимания...
Поэтому я попытался немного отредактировать код (не бросайте в меня кирпичи - я новичок в программировании). Существует метод, который записывает записанные переменные из списков в таблицу SQL:
public void WriteRecordedVariableToSQL()
{
if (timeTumbler == true && VariablesToBulkSQLList2.Count > 0)
{
List<VariableRecord> sortedVariablesToBulkSQLList2 = VariablesToBulkSQLList2.OrderBy(o => o.Time).ToList();
context.VariableRecords.AddRange(sortedVariablesToBulkSQLList2);
context.BulkSaveChanges();
VariablesToBulkSQLList2.Clear();
sortedVariablesToBulkSQLList2.Clear();
}
if (timeTumbler == false && VariablesToBulkSQLList1.Count > 0)
{
List<VariableRecord> sortedVariablesToBulkSQLList1 = VariablesToBulkSQLList1.OrderBy(o => o.Time).ToList(); //sortuju podle casu
context.VariableRecords.AddRange(sortedVariablesToBulkSQLList1);
context.BulkSaveChanges();
VariablesToBulkSQLList1.Clear();
sortedVariablesToBulkSQLList1.Clear();
}
}
Но результат был тот же. Как видите, я использую Entity FrameWork Extentions ( EFE) и их AddRange для добавления полных списков. Может ли проблема быть там?
Поэтому я хотел бы решить эту проблему, если в таблице SQL есть значения, упорядоченные по времени (с правильным порядком идентификатора).
Вы можете мне помочь? Заранее спасибо. Надеюсь, вы понимаете мой плохой английский.
1 ответ
Вот немного об основах. Идентификатор в вашем случае (сгенерированный PK с помощью SQL Server) является бессмысленным полем. Другими словами, это поле, которое не несет никакой полезной информации, кроме того, что является уникальным ключом для этой конкретной строки в таблице. Он не определяет порядок или последовательность.
Для вашего примера сортировка является частью поиска данных и будет включать в себя выбор (и сортировку) на основе поля, которое вы используете для хранения времени. Это не влияет или не влияет на первичный ключ.
Дополнение: в конечном итоге вам будет больно пытаться "встроить" интеллект с помощью ваших первичных ключей. Это одна из причин, почему их также называют "суррогатными" ключами. Это часть искусственной информации, которая не меняется и относится к уникальной строке.
Другие типы ключей включают в себя "подходящие" ключи (уникальные, но изменяемые) и "внешние" ключи (первичный ключ для другого объекта). Индексы, которые несущественны, но полезны для производительности, включают "составные" ключи, которые объединяют несколько полей (в качестве ключа-кандидата или для простоты сортировки) и индексы для одного поля, которые в основном предназначены для производительности БД.