繁体   English   中英

在实体框架中处理大数据的最佳方式

[英]Best way to handle large data in entity framework

嗨,我正在使用 EF6,其中我有大量数据可以从我的查询的数据库中进行选择,如下所示:

var EntityInfo = _contextRegister.Entities.Where(x => x.IsDeleted != true).ToList();
foreach (var itm in EntityInfo)
{
    Entity.Entity entity = new Entity.Entity();
    entity.MainActivityId = itm.MainActivityId;
    entity.SubGroupId = itm.SubGroupId;
    entity.Id = Convert.ToInt32(itm.Id);
-------
    entity.UAECityRegion = _contextFRAMEWORK.UAECityRegions.Where(m => m.Id == itm.UAECityRegionId).Select(m => m.RegionName).FirstOrDefault();
    var voucherstautus = _contextRegister.EPayVoucherDatas.Where(m => m.EntityId == itm.Id).ToList();
    foreach (var item in voucherstautus)
    {
        if (item.VoucherStatus == 10)
        {
            entity.PaymentStatus = Convert.ToInt32(item.VoucherStatus);
            break;
        }
     }

     entityList.Add(entity);
}

这个查询需要超过 10 分钟,我怎样才能使这个查询更好,或者我应该使用存储过程而不是框架?

据我EPayVoucherDatasEntitiesEPayVoucherDatas之间存在 1:1 的关系(否则您的代码_contextRegister.EPayVoucherDatas.Where(m => m.EntityId == itm.Id)将不起作用)。 因此,首先确保您已在 EF 模型中对这种关系进行建模

如果这是真的,你可以写这样的东西:

_contextRegister.EPayVoucherDatas.Where(m => !m.Entity.IsDeleted);

这已经消除了您的部分问题。

另一部分是您对另一个数据库_contextFRAMEWORK ,它似乎包含相同 ID 下的一些其他数据。 在您当前的实现中,您分别要求每个项目的特定区域。 但是根据该表的大小,将整个表拉出一次(在 for 循环之外)并在本地进行查找可能更明智。 如果 VoucherStatus 也是 10,你也有这个 if 语句将 PaymentStatus 设置为 10。在所有其他情况下是什么? 也许您总是可以从 VoucherStatus 映射 PaymentStatus?

很多问题而不是真正的答案,因为像往常一样,这取决于 尽量减少对数据库的调用量,并检查每次调用返回的实体数量。 尽早按某些条件进行过滤,以尽量减少服务器返回的数据量,并尽量减少与服务器的连接。 即使这会导致相当复杂的查询。 这对于 SQL 服务器来说通常不是问题,因为这就是它的用途。

1) 检查是否为 WHERE 条件中使用的每个字段创建了数据库索引,例如:

x.IsDeleted
m.Id 
m.EntityId

您可以使用模型构建器创建索引:

modelBuilder.Entity<Person>()
    .HasIndex(p => p.Name)
    .IsUnique();

https://stackoverflow.com/a/47031294/194717

您还可以使用 IndexAttribute 创建索引

public class Blog
{
    public int Id { get; set; }
    public string Title { get; set; }

    [Index]
    public int Rating { get; set; }

    public virtual ICollection<Post> Posts { get; set; }
}

https://blog.oneunicorn.com/2014/02/15/ef-6-1-creating-indexes-with-indexattribute/

2)您不应该为每个实体记录两次访问数据库。 尝试将其写为 JOIN ( .Include() )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM