有一些表对其他表有 FK。此方法返回玩家的统计信息。在钥匙的帮助下,我找到了玩家,然后获取了他的统计数据(另一张表)。
public Statistic GetStatisticFromPlayer(int playerId)
{
//return _context.Players.FirstOrDefault(p => p.Id == playerId).Statistic; не будет работать, ибо statistic == null
return _context.Players.Where(p => p.Id == playerId).Select(p => p.Statistic).FirstOrDefault();
}
第一个选项将返回 null ,因为不会为此对象初始化 Statistic 字段(另一个表),并且将使用 Select 方法返回 Statistic 对象。
请解释 Select 方法如何在幕后工作。
这个请求:
工作如下。该方法
FirstOrDefault
是调用链中的最后一个。执行后,Player
. 并且已经在客户端上,该属性将被占用Statistic
。SQL 查询将如下所示:
正如我们所见,查询不包含来自 Statistic 表的信息。
默认情况下,EF Core 不会从相关表中加载数据。
您可以通过一种或另一种方式执行此加载:加载相关数据。
最常见的方式是急切加载。
让我们添加到请求中
Include
:这将生成如下查询:
将进行两个表的连接 (JOIN),并从两个表中获取数据。
这将给出所需的结果:属性的值
Statistic
将包含对象。但是,如果除了这个对象之外不需要其他数据(Player 对象),那么这个请求是低效的:它请求并实现了额外的数据。
这是您的要求:
生成以下 SQL:
如您所见,仅从数据库返回 Statistic 数据。如果不需要 Player 数据,则此查询比上一个查询更有效。
可以以不同方式查看进入数据库的 SQL 查询。可能最简单的方法是使用Simple Logging。
将以下行添加到方法中
OnConfiguring
:该参数
LogLevel.Information
将切断不必要的服务信息。没有它,就会有太多的噪音。我假设正在使用 Sql Server,尽管这并不重要。
我从额外的括号和其他东西中手动清除了生成的 sql 查询。