2010-08-09 4 views
0

Суммы элементов в коллекции: ~ 100k Количество полей отображаются в столбцах: 4-10Отображение большой коллекции в DataGrid

сама проблема - сбор берутся из базы данных с использованием EntityFramework. Для загрузки и материализации всех необходимых данных требуется около 10-12 секунд на компьютерах-разработчиках. Еще одна вещь, которая возникает, заключается в том, что одна и та же коллекция может быть привязана к нескольким элементам управления, и поэтому их необходимо отдельно отфильтровать (= не устанавливать фильтры коллективного просмотра по умолчанию). В настоящее время я установить связывание следующим образом:

Binding b = new Binding(); 
b.Source = new CollectionViewSource() { Source = MyLargeCollection }.View; 
MyDataGrid.SetBinding(DataGrid.ItemsSourceProperty, b); 

Создание нового CollectionViewSource значительно увеличивает время, необходимое для инициализации - несколько минут (и я подозреваю, что это перечисление 100k коллекции по некоторым причинам). Я имею в виду, что если я просто установить:

b.Source = MyLargeCollection; 

Это будет просто взять эти 10-12 секунд, чтобы загрузить и материализовать данные из базы данных.

Вопрос - есть ли какие-либо проблемы с моим кодом? Если нет - какой был бы правильный подход для привязки одной и той же большой коллекции к элементам управления элементами, но с разными представлениями коллекции?

ответ

1

Просто используйте Linq to Entities для загрузки объектов с указанным фильтром, чтобы убедиться, что вы не загружаете все записи 10k, потому что ни один пользователь не заинтересован в сетке с записями 10k.

Пример привязки к запросу:

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

Таким образом, вы только загружать записи, необходимые для управления

+0

Ну, это решает только проблему частично. Я понимаю, что это простой способ фильтрации и сортировки набора результатов. Рассмотрите случай, когда вам нужно иметь что-то вроде записей 100k в одном элементе управления (== или создать «чувство» для пользователя, что там есть 100k записей). Каков наилучший способ ее оптимизации? Сначала подумайте - просто запросите необходимые данные => виртуализацию данных. Однако это вызовет проблемы с такими методами, как IndexOf в базовой коллекции и т. Д. – Jefim

+0

Если вам нужна такая функциональность, вам нужно будет реализовать собственный класс, который обертывает вашу полную коллекцию, которая еще не инициализирована, и создавать пользовательские реализации Count, IndexOf, Indexer, ... Хорошим предложением является реализация IList . Надеюсь, это поможет вам –

+0

Ну, я закончил вопрос о частичных данных, которые не получают материализацию и отслеживаются инфраструктурой сущности. В то же время я использую SelectedValuePath = Id для выбора объектов по id. Таким образом, потребление памяти минимально. Время загрузки такой коллекции зависит от моей машины от 0,2 до 0,5 секунды для набора из 100 тыс. Объектов. Потребление памяти составляет около 20-30 мб для двух столбцов nvarchar (255). Это только мой случай, а не контрольный показатель. – Jefim

Смежные вопросы