实体框架核心很慢 - 我如何让它更快?

001*_*001 2 c# database postgresql entity-framework-core

从数据库中检索记录并将其分配给对象.

private readonly ApplicationDbContext _context;
var itemsData = _context.Items;

for (int i = 0; i < itemsData.Count(); i++)
{
    _Response.Items.Add(new Models.Items
        {
            Name = itemsData.ToList()[i].Name,
            ....
            Created = (DateTime)itemsData.ToList()[i].Created,
            Updated = (DateTime)itemsData.ToList()[i].Updated
        });
}
Run Code Online (Sandbox Code Playgroud)

注意:记录少于1000条,并且已经显而易见.

Ste*_*eve 6

您正在调用ToList每次迭代,每次迭代都会对数据库执行SQL查询.这样做了1000次,难怪它很慢.

只需拨打ToList一次然后foreach结果:

var itemsData = _context.Items.ToList();

foreach (var item in itemsData)
{
    _Response.Items.Add(new Models.Items
    {
        Name = item .Name,
        ....
        Created = (DateTime)item.Created,
        Updated = (DateTime)item.Updated
    });
}
Run Code Online (Sandbox Code Playgroud)

  • 您可以做的另一件事情如果您只是将这些正确地放入响应中,那么您不需要跟踪.可以使用`_context.Items.AsNoTracking().ToList();`和EF不会花时间将跟踪内容放到位. (4认同)
  • @001 还有其他性能提升。我相信在某个时刻,重新创建 DBContext 并在每次迭代中保存实际上会更快。这可以防止更改跟踪器变得太大,从而显着减慢请求速度。 (2认同)