获取导航 属性 的 Count() 而无需在 Entity Framework 中加载整个集合
Getting Count() of navigation property without loading whole collection in Entity Framework
在 XAML 中,DataGrid 绑定到名为 Results
的 EF 实体列表。其中一列绑定到 Buildings
导航 属性 的 Count
。延迟加载已关闭。所以我需要在查询中包含 Buildings
以计算它。这会导致性能问题,因为整个 Buildings
实体集合加载到内存中。但我只需要 Count
个。有没有办法在不将导航 属性 加载到内存的情况下获得 Count
的导航?
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。看起来这是一个气味的东西。什么是标准模式?
如果您只需要 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>
在 XAML 中,DataGrid 绑定到名为 Results
的 EF 实体列表。其中一列绑定到 Buildings
导航 属性 的 Count
。延迟加载已关闭。所以我需要在查询中包含 Buildings
以计算它。这会导致性能问题,因为整个 Buildings
实体集合加载到内存中。但我只需要 Count
个。有没有办法在不将导航 属性 加载到内存的情况下获得 Count
的导航?
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。看起来这是一个气味的东西。什么是标准模式?
如果您只需要 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>