Отображение большой коллекции в DataGrid
Количество предметов в коллекции: ~100k Количество полей, отображаемых в столбцах: 4-10
Сама проблема - коллекция берется из базы данных с использованием EntityFramework. Для разработки и материализации всех необходимых данных требуется около 10-12 секунд на компьютерах разработчиков. Еще одна вещь, которая возникает, заключается в том, что одну и ту же коллекцию можно привязать к нескольким элементам управления, и, следовательно, они должны фильтроваться отдельно (= не устанавливая фильтры представления коллекции по умолчанию). В настоящее время я установил привязку следующим образом:
Binding b = new Binding();
b.Source = new CollectionViewSource() { Source = MyLargeCollection }.View;
MyDataGrid.SetBinding(DataGrid.ItemsSourceProperty, b);
Создание нового CollectionViewSource значительно увеличивает время, необходимое для инициализации - несколько минут (и я подозреваю, что по какой-то причине он перечисляет коллекцию 100 КБ). Я имею в виду, что если я просто установлю:
b.Source = MyLargeCollection;
Эти 10-12 секунд потребуются для загрузки и материализации данных из базы данных.
Вопрос - есть ли проблемы с моим кодом? Если нет - какой будет правильный подход для привязки одной и той же большой коллекции к различным элементам управления элементами, но с разными представлениями коллекции?
1 ответ
Просто используйте Linq to Entities для загрузки сущностей с указанным фильтром, чтобы убедиться, что вы не загружаете все записи по 10 тыс., Потому что ни один пользователь не заинтересован в сетке с 10-тысячными записями.
Пример привязки к запросу:
grid1.DataContext = (from i in context.MyItems
where i.MyPropertyToFilter == "myFilter"
select i).ToList();
grid2.DataContext = (from i in context.MyItems
where i.MyOtherPropertyToFilter == "myOhterFilter"
select i).ToList();
Таким образом, вы загружаете только записи, необходимые для ваших элементов управления