2

Используя Entity Framework, получаю данные с БД (ленивая загрузка) и гружу их в DataGrid. Примерный код:

DevicesDBEntities dBEntities = new DevicesDBEntities();  // Сущности БД
IQueryable<Device> deviceList = from d in dBEntities.Devices
                               where .....
                               select d;         // (10 мс)
dgDeviceTable.ItemsSource = deviceList.ToList(); // Загрузка в таблицу (2500 мс)
dgDeviceTable.Items.Refresh();                   // Обновление данных в таблице

в xaml файле данные биндятся следующей строкой:

<DataGrid Style="{StaticResource DataGridStyle}" x:Name="dgDeviceTable" VirtualizingStackPanel.VirtualizationMode="Recycling" VirtualizingStackPanel.IsVirtualizing="True" EnableColumnVirtualization="True" EnableRowVirtualization="True" AutoGenerateColumns="False" CanUserAddRows="False" MouseDoubleClick="DgDeviceTable_MouseDoubleClick" Margin="0,0,0,100" SelectionChanged="DgDeviceTable_SelectionChanged" BorderBrush="#FFA0694F">
                        <DataGrid.Columns>
                            <DataGridTextColumn Binding="{Binding Act.ActNumber, Mode=OneWay}" Header="Акт" Width="40"/>
                            <DataGridTextColumn Binding="{Binding DeviceType.DeviceTypeName, Mode=OneWay}" Header="Тип" Width="100"/>
                            <DataGridTextColumn Binding="{Binding DeviceNumber, Mode=OneWay}" Header="Номер" Width="100"/>
                            ...
                        </DataGrid.Columns>
                    </DataGrid>

В таблице 16000 строк. Момент сортировки занимает примерно 10 мс, загрузка данных - 2500 мс, прорисовка таблицы с данными ~ 3000 мс. Подскажите, как можно уменьшить (оптимизировать) время загрузки данных и прорисовки таблицы? Можно ли как-то синхронизировать загрузку данных с отображением их в таблице ui, чтобы данные уже появлялись в таблице синхронно в момент их загрузки, начиная с первого элемента?

Maks
  • 237
  • 2
  • 15
  • судя по всему, у вас не работает виртуализация данных в таблице. затрудняюсь сказать, что конкретно сломалось. в англоязычном стековерфлов полно вопросов на эту тему. вот например: https://stackoverflow.com/questions/20420457/using-virtualization-for-wpf-datagrid-inside-scrollviewer – Алексей Обухов Sep 06 '21 at 11:52
  • Что за интерфейс такой IQuarable? Быть может IQueryable? – aepot Sep 06 '21 at 12:10
  • @aepot, очепятка:)) – Maks Sep 06 '21 at 12:41
  • @АлексейОбухов, да, виртуализация всё-таки не отрабатывает (временно убрал параметры VirtualizingStackPanel и разницы никакой). Посмотрел по ссылке решения, там у человека DataGrid был засунут в ScrollViewer, у меня же TabItem -> Grid -> DataGrid, т.е. всё вроде нормально в этом плане – Maks Sep 06 '21 at 13:06
  • @АлексейОбухов, хотя нет, видимо отрабатывает, т.к. у меня прокрутка стала сильно тормозить – Maks Sep 06 '21 at 13:13
  • @aepot, проблема в том, что писалось это всё добро в свое время с использованием wpf но со схемой разделения mvc, т.к. с mvvm не было времени разбираться.. да и пример в основном по использованию пагинации – Maks Sep 07 '21 at 08:43
  • @aepot, и меня всё же больше интересует возможность какой-либо синхронизации DataGrid с контекстом в момент получения данных и мгновенным отображением их в таблице (начиная с получения первого элемента) – Maks Sep 07 '21 at 08:46
  • А что если у linq-запроса вызвать метод AsAsyncEnumerable(), начать проходить по нему вручную циклом, поместить в List (ObservableCollection?) пару десятков значений, привязать этот лист к датагриду, а потом продолжить перечисление последовательности AsyncEnumerable, добавляя значения в лист. – Alexander Petrov Sep 07 '21 at 16:00
  • 1
    @АлексейОбухов, спасибо огромное за ответ, в принципе, вполне сходит за решение!:) но метод AsAsyncEnumerable() содержится в пространстве имен EntityFrameworkCore, а у меня не core версия Entity. Может попробую потом тестово накатить и проверить – Maks Sep 09 '21 at 08:42

0 Answers0