IDを使用したLinqクエリの結果が遅くなる(EFコア)

asp.net-core asp.net-mvc entity-framework entity-framework-core linq

質問

私は次のlinqクエリを持っています

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つのマッチを返すので、ここで行うことはあまりありません。

このクエリはControllerクラスの一部であり、ASP.NET CoreおよびEntityFramework Coreを使用しています。

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

SELECT *
FROM Address
WHERE ZipCode = '29130'

受け入れられた回答

上記のクエリは下記のように書き直すことができます。ここでパフォーマンスについてご連絡ください。

 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();
     }
    }

人気のある回答

.NETとエンティティフレームワークのどのバージョンを使用しているのか分かりませんが、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とフェッチされるレコードの数にも依存します。このソリューションを試すことができます。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ