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

时间:2014-12-31 17:47:23

标签: c# linq entity-framework

阅读后: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();

会有更好的方法吗?

3 个答案:

答案 0 :(得分:3)

不需要Take(1)。另外,这个类型更短。

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

答案 1 :(得分:1)

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

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

顺便说一句,这似乎只是在查看子表DirDs

答案 2 :(得分:1)

在您的示例中,您将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 - Any VS First VS Exists