使用ID的Linq查询返回结果缓慢(EF Core)

时间:2016-09-10 00:19:25

标签: asp.net-mvc entity-framework linq asp.net-core entity-framework-core

我有以下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'

2 个答案:

答案 0 :(得分: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 :(得分: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和正在获取的记录数。你可以尝试这个解决方案。