如果使用 Entity Framework,子查询会多次访问数据库
Do sub-queries hit database multiple times if using Entity Framework
可能看起来像一个愚蠢的问题,但请阅读它...我正在编写一些服务,并且出现了一种情况,我必须使用 Entity Framework 的子查询。现在我已经编写了一个带有子查询的查询,但是我编写它的方式让我想到我的查询是否两次访问数据库?
下面是实际查询的伪代码....
var data = databaseContext.FirstTable
.Where(x => x.Group_Id == (databaseContext.SecondTable
.Where(y => y.DomainName == "gmail.com")
.Select(x => x.Group_Id)
.FirstAndDefault()))
.ToList();
此查询给出了我的预期结果,但我认为它访问了数据库两次。我说得对吗?
现在我不需要是或否的答案,而是简短的描述,我可以将此查询转换为连接查询吗?还有一些工具或提示可以检查 SQL 服务器中的数据库命中率,例如跟踪器或其他东西。
是的。当您首先调用或默认调用时,Iqueryable 将被发送到数据库。您可以使用事务来欺骗它。此外,建议您在此处执行的操作使用事务。另外对于你正在尝试做的事情,我建议使用 EF 的过渡属性。
var data = databaseContext.FirstTable
.Include(x=>x.SecondTable)
.Where(x => x.SecondTable.DomainName == "gmail.com")
SQL 服务器分析器将向您显示对数据库的所有查询。当然不建议在本地主机以外的任何地方使用它。
可能看起来像一个愚蠢的问题,但请阅读它...我正在编写一些服务,并且出现了一种情况,我必须使用 Entity Framework 的子查询。现在我已经编写了一个带有子查询的查询,但是我编写它的方式让我想到我的查询是否两次访问数据库?
下面是实际查询的伪代码....
var data = databaseContext.FirstTable
.Where(x => x.Group_Id == (databaseContext.SecondTable
.Where(y => y.DomainName == "gmail.com")
.Select(x => x.Group_Id)
.FirstAndDefault()))
.ToList();
此查询给出了我的预期结果,但我认为它访问了数据库两次。我说得对吗?
现在我不需要是或否的答案,而是简短的描述,我可以将此查询转换为连接查询吗?还有一些工具或提示可以检查 SQL 服务器中的数据库命中率,例如跟踪器或其他东西。
是的。当您首先调用或默认调用时,Iqueryable 将被发送到数据库。您可以使用事务来欺骗它。此外,建议您在此处执行的操作使用事务。另外对于你正在尝试做的事情,我建议使用 EF 的过渡属性。
var data = databaseContext.FirstTable
.Include(x=>x.SecondTable)
.Where(x => x.SecondTable.DomainName == "gmail.com")
SQL 服务器分析器将向您显示对数据库的所有查询。当然不建议在本地主机以外的任何地方使用它。