获取导航属性的Count()而不在Entity Framework中加载整个集合

AsV*_*leO 2 c# xaml entity-framework eager-loading navigation-properties

在XAML中,DataGrid绑定到一个名为EF实体的列表Results.一列被绑定到CountBuildings导航属性.延迟加载已关闭.所以我需要包含Buildings在查询中,以获得它的数量.这会导致性能问题,因为整个Buildings实体集合会在内存中加载.但我只需要Count它.有没有办法获得Count导航属性而不将其加载到内存中?

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

在XAML中绑定:

<DataGridTextColumn Binding="{Binding Buildings.Count}"/>
Run Code Online (Sandbox Code Playgroud)

还有一点其他问题.我用它:.Where(x => true)将DbSet强制转换为IQueryable.看起来这是一种气味的东西.什么是标准模式?

Mic*_*ger 6

如果您只是需要,Count那么您可以创建以下查询

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

然后在XAML中绑定到BuildingCount属性而不是另一个属性.

<DataGrid>
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding Street}"/>
        <DataGridTextColumn Binding="{Binding StreetType }"/>
        <DataGridTextColumn Binding="{Binding District }"/>
        <DataGridTextColumn Binding="{Binding BuildingCount }"/>
    </DataGrid.Columns>
</DataGrid>
Run Code Online (Sandbox Code Playgroud)