gpt4 book ai didi

c# - 为什么 Entity Framework .ToList() with .Include 非常慢,我怎样才能加快速度?

转载 作者:行者123 更新时间:2023-11-30 14:58:10 25 4
gpt4 key购买 nike

我正在使用 EF4 查询 oracle 数据库。

我有 2 个表 POINTS(大约 100 000 行)和 COUNTRIES,每个点都有一个 countryCode 作为外键

我在存储库中有以下 2 个方法

public List<PointsTable> GetAll()
{
using (Entities context = new Entities())
{
List<PointsTable> theList = context.POINTS_TABLE.ToList();
return theList;
}
}

public List<PointsTable> GetAllComplete()
{
using (Entities context = new Entities())
{
List<PointsTable> theList = context.POINTS_TABLE.Include("Countries").ToList();
return theList;
}
}

GetAll 需要 5 秒,而 GetAllComplete 需要 2 分钟!

我已经使用了 AsParallel() 但 yield 是荒谬的。

我可以加快速度吗,或者是什么导致它变慢了?

最佳答案

原因是对于您要检索的每条记录,20 万条记录乘以大量 的记录。

您是否打算稍后查询此数据以将其缩减为满足您的特定需求?如果是这样,请不要 .ToList() 它们。

更改您的存储库方法以返回IQueryable,这样您就可以将查询限制为您稍后需要的特定数据,从而减少您放入内存中的数据量

private Entities _context;

public PointsRepository(Entities context)
{
_context = context
}

public IQueryable<PointsTable> GetAll()
{
return context.POINTS_TABLE;
}

public IQueryable<PointsTable> GetAllComplete()
{
return context.POINTS_TABLE.Include("Countries");
}

然后您可以添加您的特定过滤器和 ToList 较小的结果。例如

using (Entities context = new Entities())
{
var rep = new PointsRepository(context);

// This will change the query you send to sql to only
// retrieve the specific data you want and should result
// in much quicker execution
var result = rep.GetAllComplete() // get all with includes
.Where(p => p.Property = "Specific") // refine the query
.ToList() // retrieve the data and add to memory
}

希望对你有帮助

关于c# - 为什么 Entity Framework .ToList() with .Include 非常慢,我怎样才能加快速度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19676376/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com