【发布时间】:2021-06-04 09:18:22
【问题描述】:
例如,假设我的数据库有一个包含数千艘船的表,每艘船都可能有数千名乘客作为导航属性:
public DbSet<Ship> Ship { get; set; }
public DbSet<Passenger> Passenger { get; set; }
public class Ship
{
public List<Passenger> passengers { get; set; }
//properties omitted for example
}
public class Passenger
{
//properties omitted for example
}
示例用例是有人按 API 获取 所有 艘船,并想知道每艘船是否为空(0 名乘客),因此返回的 JSON 将包含船舶列表每个都有一个布尔值是否为空。
我目前的代码似乎效率很低(包括所有乘客,只是为了确定一艘船是否是空的):
List<Ship> ships = dbContext.Ship
.Include(x => x.passengers)
.ToList();
以及稍后将船只序列化为 JSON 时:
jsonShip.isEmpty = !ship.passengers.Any();
我想要一个性能更高(而不是臃肿)的替代方案,而不是包括所有乘客。我有什么选择?
我查看了computed columns,但它们似乎只支持将 sql 作为字符串。如果可能的话,我想留在 C# 代码世界中,例如,通过在 SQL 查询中自动编织来正确设置一个属性将是最佳选择。
【问题讨论】:
-
您如何确定您的代码效率低下?您是否测量了它的执行时间并发现它不符合特定的软件要求?
-
您实际上并没有展示如何计算与一艘船相关的乘客数量。您现在所做的就是将所有船只及其相关乘客检索到内存中。 EF 支持过滤它返回的数据——它甚至可以在检索所有结果之前在数据库端进行过滤。您是否研究过如何使用 EF 过滤数据? documentation 是使用任何框架时入门的好地方。
-
@RobertHarvey 您的评论可能针对过早的优化。我的问题不是针对一个地方的具体用例,而是为了了解我的选择是什么,以使用 C# 代码在数据库端计算值。有一天可能会派上用场。
-
@mason 以最简单的方式:
bool shipIsEmpty = !ship.passengers.Any();。你能为我指出正确的方向吗?我看不出过滤器如何确定一艘船是否有乘客。
标签: c# postgresql entity-framework-core ef-core-5.0