2

В XAML DataGrid привязан к списку объектов EF, называемых Results. Один из столбцов связан с Count из Buildings навигационной функцией. Ленивая загрузка отключена. Поэтому мне нужно включить Buildings в запрос, чтобы получить его. Это вызывает проблемы с производительностью, поскольку целая коллекция объектов Buildings загружается в память. Но мне просто нужен Count. Есть ли способ получить Count свойства навигации, не загружая его в память?Получение значения атрибута навигации без загрузки всей коллекции в Entity Framework

var resQuery = 
       db.BAStreets 
        .Include("Street.StreetType") 
        .Include("Area.District") 
        .Include("Buildings") 
        .Where(x => true); 
    Results = resQuery.ToList(); 

Связывание в XAML:

<DataGridTextColumn Binding="{Binding Buildings.Count}"/> 

И немного дополнительный вопрос. Я использую это: .Where(x => true), чтобы передать DbSet в IQueryable. Похоже, это запах. Что такое стандартный шаблон?

+1

К вашему дополнительному вопросу; либо просто используйте возвращаемый тип в любом случае (и не важно, что это более точно, чем строго необходимо, он все равно будет реализовывать «IQueryable »), или в тех немногих случаях, когда это не работает, используйте '.AsQueryable()'. –

ответ

6

Если вам просто нужно Count, то вы можете создать следующий запрос

Results = db.BAStreets.Select(i => new 
           { 
            Street = i, 
            StreetType = i.Street.StreetType, 
            District = i.Area.District, 
            BuildingCount = i.Buildings.Count() 
           }).ToList() 

Затем в XAML привязывается к BuildingCount собственности, а не другим.

<DataGrid> 
    <DataGrid.Columns> 
     <DataGridTextColumn Binding="{Binding Street}"/> 
     <DataGridTextColumn Binding="{Binding StreetType }"/> 
     <DataGridTextColumn Binding="{Binding District }"/> 
     <DataGridTextColumn Binding="{Binding BuildingCount }"/> 
    </DataGrid.Columns> 
</DataGrid> 
+0

Более знакомы с LINQ, чем Entity Frameowrk, но не могли бы вы просто использовать метод '.Count()' вместо '.ToList()'? – David

+0

'.Count' предназначен только для зданий, а не для BAStreets. Он хочет, чтобы граф для каждого BAStreet, а не общее количество Зданий для любого экземпляра в базе данных. –

+0

Вот и все! Спасибо, MURO. – AsValeO

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