на самом деле это не проблема, но больше беспокоит, и я был бы признателен за некоторые комментарии, пожалуйста.
Winforms C # .net3.5 [sp1] Visual Studio 2008 с использованием Linq2Sql (точнее, PLINQO ... что фантастически Кстати!). У меня есть набор результатов, возвращающий +/- 19000 строк данных (с примерно 80 байтами данных на строку), и я решил переместить метод извлечения данных в фоновый режим и соответствующим образом обновить пользовательский интерфейс. Это нормально работает.
Однако я заметил некоторые различия в производительности при использовании разных возвращаемых типов для моего метода извлечения данных Ling. Я знаю, что все предлагают вернуть List<T>
или IEnumarable<T>
и установить для этого источник данных DataGridView, но, к сожалению, он не поддерживает сортировку объектов изначально. Покопавшись, я нашел SortableBindingList<T>
на MSDN здесь. Я применил его, и сетке потребовалось менее секунды, чтобы заполнить себя, однако, когда я щелкаю столбец, чтобы отсортировать его, для реализации сортировки потребовалось чуть больше секунды или около того.
Затем я решил пойти по маршруту DataTable, но обнаружил, что метод ToDataTable был удален, но после дополнительных поисков нашел способ реализовать его на этом статья MSDN. После его применения я обнаружил, что извлечение заняло около 2 секунд, чтобы заполнить сетку, но после этого сортировка (по 19000 строкам!) Была мгновенной !! Естественно, я придерживался этого подхода.
Также имейте в виду, что я отключил любое редактирование / добавление / удаление в сетке. Сетка предназначена исключительно для отображения данных. Любые другие операции CRUD предоставляются диалоговыми формами в соответствии с текущей выбранной строкой (столбец скрытого первичного ключа).
Вот код, который я использовал для обоих методов:
1) SortableBindingList
//declare private member
private SortableBindingList<PdtAllocation> listAlloc = null;
private void RefreshData() {
bcsDataContext ctx = new bcsDataContext();
try {
listAlloc = new SortableBindingList<PdtAllocation>(ctx.PdtAllocation.ToList());
}
catch (Exception) {
throw;
}
finally {
ctx.Dispose();
}
dataGridView1.DataSource = listAlloc;
}
2) CopyToDatatable
//declare private member
private DataTable dt = null;
private void RefreshData() {
dt = new DataTable();
bcsDataContext ctx = new bcsDataContext();
try {
ctx.PdtAllocation.CopyToDataTable(dt, LoadOption.PreserveChanges);
}
catch (Exception) {
throw;
}
finally {
ctx.Dispose();
}
dataGridView1.DataSource = dt;
}
Теперь я знаю, что это, вероятно, похоже на случай «спросил и ответил», но я был бы очень признателен за ваш вклад, а также за любые известные проблемы с переходом по маршруту CopyToDataTable()
.
Спасибо .... и извиняюсь за долгий вопрос!