2016-04-15 25 views
0

Webサイトに外部リンクがあるページがあるかどうかに基づいて、trueまたはfalseを返すこのメソッドがあります。パフォーマンスの問題を引き起こすlinqクエリ

このメソッドは機能しません。しかし、それは信じられないほど遅いです。合計5000ページの合計100ウェブサイトを処理するのに約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クエリをスピードアップするか、または別のものに置き換える方法はありますか?文によって

+0

これがデータベースに問い合わせると仮定すると、関連するテーブルのスキーマを投稿できますか? –

答えて

3

...

var website = FetchModel(id); 

...あなたは、データベースから1 websiteを取り出します。その後、website.WebPagesにアクセスします。これにより、websiteのすべてのWebPagesが別のクエリ(遅延読み込み)に読み込まれます。これらの各ページについて、ExternalLinksは、少なくとも1つの外部リンクを持つ最初のページが見つかるまで、さらに別のクエリでクエリになります。したがって、リンクがないページが多数ある場合、これにはかなりの時間がかかります。

解決策は1つのクエリで行うことです。コンテキストを直接使用すると、次のようになります。

var externalLinks = 
    context.Websites 
      .Any(w => w.Id == id 
        && w.WebPages 
         .Any(wp => wp.Links.ExternalLinks.Any())); 

これは、ブール値を返す1つのクエリを実行します。

これはあなたのアーキテクチャにどのように適合しているかわかりません。あなたが文脈をどのくらい深く掘り下げていて、どのくらいの自由をもってそれを使って実行するクエリを形作ることができるかによって異なります。

関連する問題