Linq查询使用ID返回结果慢(EF 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个匹配项,所以这里没有那么多要做的。

这个查询是控制器类的一部分,我使用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();
     }            
}

在这一点上,我没有任何远程数据库测试,但再次延迟获取这些查询的结果也将取决于NW和被获取的记录数量。你可以试试这个方法

最新更新