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

时间:2015-05-06 14:23:20

标签: c# entity-framework xaml eager-loading navigation-properties

在XAML中,DataGrid绑定到名为Results的EF实体列表。其中一列绑定到Count Buildings导航属性。延迟加载已关闭。因此,我需要在查询中包含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。看起来这是一种气味的东西。什么是标准模式?

1 个答案:

答案 0 :(得分:6)

如果您只需要DataModelProperty p=DataModelProperty.valueOf("ITEM_DESC");// just as example List<DataModel> filtered = data.stream() .filter(p.asPredicate(query)) .collect(Collectors.toList()); ,那么您可以创建以下查询

Count

然后在XAML中绑定到Results = db.BAStreets.Select(i => new { Street = i, StreetType = i.Street.StreetType, District = i.Area.District, BuildingCount = i.Buildings.Count() }).ToList() 属性而不是另一个属性。

BuildingCount