Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在不获取所有行的情况下更新数据库_C#_Sql_Entity Framework_Linq_.net Core - Fatal编程技术网

C# 在不获取所有行的情况下更新数据库

C# 在不获取所有行的情况下更新数据库,c#,sql,entity-framework,linq,.net-core,C#,Sql,Entity Framework,Linq,.net Core,目前,我使用反射进行属性到属性的比较,以确定应该在数据库中更新哪些值。问题是,在比较现有值和新值之前,我需要从数据库中获取所有行。这些行已经过筛选,但可以包含数千条记录。因此,我的程序非常慢,并且受到所有SELECT LINQ to SQL查询的限制。这些select查询每次需要几分钟才能完成 示例LINQ: List<Customer> customersFromDatabase= _customerRepository .List() .W

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

示例LINQ:

    List<Customer> customersFromDatabase= _customerRepository
        .List()
        .Where(c=> c.country.Equals(country))
        .ToList();
有没有一种方法可以只过滤和获取特定的行,而不必首先下拉整个数据集

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


谢谢。

如果您已经有了Id,您是否可以在流程的初始步骤中抓取行:

比如:

List<Customer> customersFromDatabase= _customerRepository
.List()
.Where(c=> c.id == customer.id)
.ToList();
这将为您提供使用您提供的Id找到的客户列表,从而大大加快整个过程


另外,我假设您的Id列被索引了

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

例如,如果您显示了50行,当用户编辑一行时,它将被添加到脏集合中。当您要保存更改时,您将/w加载客户

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

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

并与您的实体一起处理您从那里收集的客户数据。

为什么不从初始查询中获取Id,这样您就可以搜索索引列,我希望这样会更快?需要检查的值会发生什么变化?如果它是应用程序,那么你的应用程序应该已经知道只有那些需要更改。如果是其他原因,那么你可能是用错误的方式做的。从筛选表中选择查询不应花费数分钟,除非有大量的行(百万行)或缺少索引或两者兼而有之。@Hexie id列有点误导,因为它实际上不是表中的键。我无法在开始时获取id,因为客户id仅对每个国家唯一。它们可能会在不同的国家重叠。@Nick.McDermaid我从csv文件中提取数据,因此在进行比较时,我只知道值是否不同。我不知道为什么要花这么长时间,但当我查看控制台输出时,它挂在select语句上。因此,您真正要做的是尝试将CSV文件合并到数据库中?你有兴趣寻求其他方法吗?我将把这些信息添加到问题中。如果不正确,请编辑它。我正在从csv文件中提取数据,这样我在进行比较时才知道值是否不同。目前,我将在列表中保存所有不同的客户,并在最后进行批量更新。所以csv是否只包含修改过的记录?如果是这样的话,我会考虑将CSV中的所有行或批行加载到内存中的对象列表中。如果CSV文件包含ID,则使用CSV内容中的ID作为我前面示例中的dirtyCustomerID。即var dirtyCustomerIds=csvItems.Selectx=>x.CustomerId.ToList;请注意,只有当CSV中的记录数量保持较低时,才会出现这种情况。CSV包含所有信息。这取决于程序来确定它们是否被修改,然后我将相应地更新数据库。CSV中的记录数是数万,然后我考虑的方法是将CSV导入到类似于“真实”表的分级表/W模式中。我会将ImportedDate/w默认设置为当前日期/时间,处理日期时间?以及处理结果的标志/状态。在处理CSV时,它将插入到该表中,没有ProcessedDate或status,然后在加载后,加载一个子集记录,比如说,每次加载100条记录,从暂存实体连接回实际表。然后,代码可以进行比较,如果发现增量,则传输数据并更新处理的日期和状态。
dbContext.Customers.Where(c=> dirtyCustomerIds.Contains(c=>c.CustomerId));