阅读后: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();
会有更好的方法吗?
答案 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