3

私は、次のLINQクエリIDリターンを使用してLINQクエリは、(EFコア)を遅くする結果

internal List<ZipCodeInfo> GetInfoFromZipCode(string zipCode) 
{ 
    using (DbContext context = new DbContext()) 
    { 
     IQueryable<ZipCodeInfo> results; 

     results = (from a in context.Address 
        where a.ZipCode.Equals(zipCode) 
        select new ZipCodeInfo 
        { 
         Field1 = a.Field1, 
         Field2 = a.Field2, 
         Field3 = a.Field3 
        }); 

     return results.ToList(); 
    } 
} 

を持っていますが、クエリ自体が完了するまで約5~6秒かかります。私はSQL上の対応するクエリを実行し、それを完了するためにほとんど何もかかりません。それはなぜそれを取っているのですか?最後のクエリでは4つの一致が返され、ここで行うことはあまりありません。

このクエリはコントローラクラスの一部であり、ASP.NET CoreとEntityFramework Coreを使用しています。

SQLクエリは、btwのようになります。

SELECT * 
FROM Address 
WHERE ZipCode = '29130' 
+0

理由は、L2Sまたはエンティティフレームワークが最適化クエリを発行しないことがあります。実行パスは常に大きいわけではありません。別の方法として、ストアドプロシージャを作成し、エンティティフレームワークを使用して呼び出す方法があります。完全なソリューションが必要な場合はお知らせください。 –

+0

あなたはdb内のストアプロシージャを意味しますか?残念ながら、私はdbを制御することはできません。クエリを実行するためのアクセス権を読み取り、ストアプロシージャを追加することはオプションではありません。他の方法がある場合は、任意のアイデア?おそらく私はEFを取り除き、通常のSQL接続を使用する必要がありますか? – user3587624

+0

なぜそれは時間がかかるのか簡単です。関数EFを呼び出すたびに、SQLスクリプトを作成してコンパイルします。だから、いつも時間がかかるでしょう。代替案を考えてみましょう。しかし一方で、古い学校に行ってADOにこの機能だけを試すことはできますか? –

答えて

1

上記のクエリは、次のように書き直すことができます。ここでパフォーマンスをご確認ください。

internal List<ZipCodeInfo> GetInfoFromZipCode(string zipCode) 
    { 
     using (DbContext context = new DbContext()) 
     { 
      //disabled tracking 
      context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking; 

      IQueryable<ZipCodeInfo> results; 

      results = (from a in context.Address 
         where a.ZipCode.Equals(zipCode) 
         select new ZipCodeInfo 
         { 
          Field1 = a.Field1, 
          Field2 = a.Field2, 
          Field3 = a.Field3 
         }); 

      return results.ToList(); 
    } 
    } 
+1

LazyLoadingはEntityFramework Coreのオプションではありません。したがって、私はそれをできません。 – user3587624

+0

はい、AsNoTracking()はどうでしょうか?任意の改善? – Sampath

+0

AsNoTracking()はEF Coreのオプションではありません:( – user3587624

0

私はあなたが使用している.NETとエンティティフレームワークのバージョンがわからないが、私は興味深い記事here on MSDNを見つけました。あなたはそれを通過することができます。しかし、コードは以下のように使用することができます:私はテストするために任意のリモートデータベースを持っていますが、もう一度、クエリのこれらの種類の結果をフェッチするために遅らせることはありません。この時点で

static readonly Func<DbEntities, IQueryable<ZipCodeInfo>> s_compiledQuery2 = 
CompiledQuery.Compile<DbEntities, IQueryable<ZipCodeInfo>>(
(ctx, total) => from a in context.Address 
       where a != null and a != "" 
       a.ZipCode.ToUpper().Equals(zipCode.ToUpper()) 
       select new ZipCodeInfo 
       { 
        Field1 = a.Field1, 
        Field2 = a.Field2, 
        Field3 = a.Field3 
       }); 

internal List<ZipCodeInfo> GetInfoFromZipCode(string zipCode) 
{    
    using (DbEntities context = new DbEntities()) 
    { 
      IQueryable<ZipCodeInfo> zipCodes = s_compiledQuery2.Invoke(context, zipCode); 
      return zipCodes.ToList(); 
    }    
} 

もN \ Wとの数に依存しますレコードが取得されます。このソリューションを試すことができます。

+0

私はこのオプションを試しましたが、CompiledQueryクラスはASP.NETコアで利用できません – user3587624

関連する問題