[英]linq query that is causing performance issues
我有一个根据网站是否有任何带有外部链接的页面返回true或false的方法。
该方法确实有效。 但是,它非常慢。 像处理一个100个网站(共5000页)大约需要5秒钟。
protected bool WebsitesWithExternalLinks(int id)
{
var website = FetchModel(id);
if (website == null) return false;
//return true;
var externalLinks = website.WebPages
.Any(wp => wp.Links != null &&
wp.Links.ExternalLinks.Any());
return externalLinks;
}
我已经查明了linq查询中某处发生了缓慢,但是我不确定为什么会这样。 我还有其他对运行非常快的WebSite和WebSage对象进行操作的linq查询。
我不确定为什么这么慢。
有什么方法可以加速linq查询或将其替换为其他东西吗?
通过声明...
var website = FetchModel(id);
...您从数据库中获取一个website
。 然后,您访问website.WebPages
。 这将在一个单独的查询中加载该website
所有WebPages
(延迟加载)。 然后,对于这些页面中的每一个, ExternalLinks
都是在更多单独的查询中进行的查询,直到找到第一页至少具有一个外部链接为止。 因此,如果有很多页面的链接为零,那么这将花费大量时间。
补救措施是在一个查询中执行此操作。 直接使用上下文看起来像这样:
var externalLinks =
context.Websites
.Any(w => w.Id == id
&& w.WebPages
.Any(wp => wp.Links.ExternalLinks.Any()));
这将执行一个仅返回布尔值的查询。
我无法从这里告诉您这如何适应您的体系结构。 取决于您对上下文的埋入深度以及您允许自己调整使用其执行的查询的自由度。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.