使用ID的Linq查詢返回結果緩慢(EF Core)

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查詢看起來像這樣,順便說一下。

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
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow