查看实体的子表是否包含任何记录的最快方法

本文关键字:记录 方法 包含任 实体 是否 何记录 | 更新日期: 2023-09-27 18:35:50

阅读后:http://forums.devart.com/viewtopic.php?f=31&t=22425&p=74949&hilit=IQueryable#p74949似乎我应该使用IQueryable来确定实体的子表是否有记录。

我最初的尝试是这样的:Ace.DirDs.Any();

这行代码

(或类似的代码行)可以运行数百次,并导致巨大的性能问题。

因此,通过阅读上面链接中的上一篇文章,我想我会尝试类似的东西:

IQueryable<DirD> dddd = CurrentContext.DirDs
    .Where(d => d.AceConfigModelID == ace.ID).Take(1);
bool hasAChild = dddd.Any();

会有更好的方法吗?

查看实体的子表是否包含任何记录的最快方法

不需要Take(1)。另外,这个打字更短。

bool hasAChild =  CurrentContext.DirDs.Any(d => d.AceConfigModelID == ace.ID);

我可能是错的,但我认为Any()仍然会导致第一行从数据库服务器的初始Read()回客户端。你可能最好得到一个Count所以你只能得到一个号码:

bool hasAChild = CurrentContext.DirDs.Count(d => d.AceConfigModelID == ace.ID) > 0;

顺便说一下,这似乎不是在看一个子表,只是DirDs.

在您的示例中,您将 IQueryable 具体化为 IEnumerable,因此执行了整个查询,然后您只是获取结果中的第一行。前面的示例答案中的任何一个都将比这快得多。使用 Count 时要小心,因为同时存在属性 Count 和方法 Count()。为了避免原始问题(如果您选择 Count 路由),您需要使用方法 Count(),就像在 Rhumborl 的例子中一样,否则它将执行查询并为您提供返回的 IEnumerable 的属性 Count。方法Count()本质上转换为SQL COUNT,而方法Any()转换为SQL EXISTS(至少Microsoft在使用SQL Server时)。在此级别,一个可能比另一个更有效,具体取决于后端数据库是什么以及你使用的 EF 版本。

我的投票是始终默认为 Any() 并在遇到性能问题时探索 Count()。在数据库级别,Count() 方法仍可能存在性能成本,但这仍然取决于您使用的数据库。

这是一个很好的相关答案: Linq To Entities - 任何 VS First VS 存在