我有以下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和被获取的记录数量。你可以试试这个方法