如何检索带有相关实体子集的实体?

时间:2019-05-28 06:04:13

标签: c# entity-framework-core

我在一对多关系中有两个实体: 仪表(1)->(n)读数

我相信我的两个实体均已正确设置以提供该关系,因此可以假定。

我希望检索具有相关读数的仪表,但是由于每米可能有很多读数,因此我希望通过例如Reading.Date来限制它。另一个选择是每米最多读取X个读数。

如何在EF.Core中做到这一点?

2 个答案:

答案 0 :(得分:2)

我认为错过的另一个答案是,您要的是相关实体的子集,即不是整个相关实体的集合。

如果您希望对获取的相关实体保持选择性,则不能仅依靠Include语句(或隐式延迟加载),因为它们被设置为加载所有相关实体。

没有选择性的Include。但是您可以制作一个包容性的Select

DateTime filterDate = DateTime.Now;

var myData = db.Meters
               .Select(m => new 
                            { 
                                Meter = m, 
                                Readings = m.Readings.Where(r => r.Date == filterDate)
                            })
               .ToList();

备注

  • 我使用了匿名类型,但是您当然也可以使用具体的DTO类。
  • Where(r => r.Date == filterDate)可以得到改进(检查Date组件或范围),这只是一个简单的示例。您可以在此处使用所需的任何过滤条件。
  • 请注意,您不需要Include语句。 Select(在尚未枚举的IQueryable上)不需要显式的Include,因为Select本身已经知道要获取的数据。
  • 我建议不要将相关实体的子集放在meter.Readings导航道具中。这将导致对该列表是子集还是整个集的混淆,当您调用SaceChanges()时,EF可能会将其实际注册为更改。导航道具不应用作具有相同类型但功能含义不同的收藏存储空间。

答案 1 :(得分:-1)

如果您的表设计正确,即Meter中的键已与Reading映射(请参阅外键约束),则EF在访问其POCO类时会自动提供相关记录。 确保读数具有数据库中仪表表的外键。