更新数据库而不抓取所有行

时间:2017-06-06 22:47:45

标签: c# sql entity-framework linq .net-core

目前我使用反射进行属性比较属性,以确定我应该在数据库中更新哪些值。问题是,在我可以对现有值和新值进行比较之前,我需要从数据库中获取所有行。这些行已经过滤但可以包含数千条记录。因此,我的程序非常慢,并且受到所有SELECT LINQ to SQL查询的瓶颈。这些选择查询一次只需几分钟即可完成。

示例LINQ:

    List<Customer> customersFromDatabase= _customerRepository
        .List()
        .Where(c=> c.country.Equals(country))
        .ToList();

这是我用来确定他们是否是新客户的LINQ,或者它们是否存在,在哪种情况下会更新。

var customerInDb = customersFromDatabase
        .Where(c=> c.id.ToLower() == customer.id.ToLower())
        .FirstOrDefault();

有没有办法过滤和抓取特定的行而不必先拉下整个数据集?

源数据是CSV文件,目标是数据库表\

感谢。

2 个答案:

答案 0 :(得分:0)

如果您已拥有该ID,那么您是否只能在流程的初始步骤中获取该行:

类似的东西:

List<Customer> customersFromDatabase= _customerRepository
.List()
.Where(c=> c.id == customer.id)
.ToList();

这会为您提供使用您提供的ID找到的客户列表,从而大大加快整个过程的速度?

另外,我假设您的Id列已编入索引?

答案 1 :(得分:0)

应用程序端您应该跟踪脏行(Ids)及其各自的版本信息。 (行版本号/上次修改日期/时间)例如,如果要显示可编辑行列表,则应用程序应至少负责跟踪哪些行已被修改,从那里您将按ID检索客户,验证他们的版本信息是相同的(其他人在您当前用户编辑时没有修改记录)处理合并,覆盖或通知(如果有并发编辑),然后根据您的属性检查更新源实体。

因此,例如,如果显示50行,则当用户编辑行时,会将其添加到“脏”集合中。当您保存更改时,您加载Customers / w

给定:dirtyCustomerIds =包含脏行的列表......

dbContext.Customers.Where(c=> dirtyCustomerIds.Contains(c=>c.CustomerId)); 

并与您的实体一起处理来自那里的脏客户数据集合。