目前我使用反射进行属性比较属性,以确定我应该在数据库中更新哪些值。问题是,在我可以对现有值和新值进行比较之前,我需要从数据库中获取所有行。这些行已经过滤但可以包含数千条记录。因此,我的程序非常慢,并且受到所有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文件,目标是数据库表\
感谢。
答案 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));
并与您的实体一起处理来自那里的脏客户数据集合。