C# 如何加快linq语句的速度,该语句检查两个列表中是否有丢失的记录
我正在努力实现的目标 我正在处理一个协调过程,需要确保我的数据库表具有正确的条目。我需要在主列表之外的表中查找记录。当我找到这些条目时,我需要对它们进行分组,并在每组中查找最新的条目。如果最新条目的操作字段定义为“已添加”,我将需要添加其他记录,其操作字段标记为“已删除”,因为它们未在主列表中定义 我编写的代码选择数据库中不在主列表中的记录。然后,它对这些项目进行分组和排序,最后选择每组中的第一个项目,这将是每组中最新的项目。然后,我只返回操作定义为“Added”的项。我已经针对我的单元测试和“真实”数据运行了这段代码。虽然它可以工作,但在运行一个包含16000条记录的数据库时(在VisualStudio中运行时),它的速度非常慢,可能需要40秒。是否有人可以建议修改我的代码以提高速度 下面显示的是查找不匹配记录的代码C# 如何加快linq语句的速度,该语句检查两个列表中是否有丢失的记录,c#,linq,C#,Linq,我正在努力实现的目标 我正在处理一个协调过程,需要确保我的数据库表具有正确的条目。我需要在主列表之外的表中查找记录。当我找到这些条目时,我需要对它们进行分组,并在每组中查找最新的条目。如果最新条目的操作字段定义为“已添加”,我将需要添加其他记录,其操作字段标记为“已删除”,因为它们未在主列表中定义 我编写的代码选择数据库中不在主列表中的记录。然后,它对这些项目进行分组和排序,最后选择每组中的第一个项目,这将是每组中最新的项目。然后,我只返回操作定义为“Added”的项。我已经针对我的单元测试和“
var linksInDb = _ctx.LinkRecords.ToList();
return (from dbl in linksInDb select dbl)
.Except(
from dbl in linksInDb
from l in links
where dbl.EP1Id == l.Endpoints[0].EntityKey.EntityId && dbl.EP2Id == l.Endpoints[1].EntityKey.EntityId
select dbl)
.GroupBy(x => new {x.EP1Id, x.EP2Id},
(key, g) => g.OrderByDescending(x => x.LastModifiedDate_UTC).First())
.Where(x => x.Operation == "Added")
.ToList();
注意。名为“links”的主列表是Link类型的通用列表,它与_ctx.LinkRecords.ToList()返回的类型相同 您应该指定它所针对的LINQ提供程序(EF?什么版本?LINQ到SQL?或者完全不同的东西?),并且您可能希望检查并发布生成/执行的SQL。您是否在
\u ctx.LinkRecords
上没有调用ToList
就尝试过它?这将把数据库中的所有记录加载到内存中,这可能需要很长时间。通过删除它,它会将您的查询转换为SQL并在数据库中运行,这可能会更快。内存中的第二个查询远远不是最优的,而且肯定可以优化。但在这样做之前,问题是这个语句需要多少时间(从总的15秒开始)var linksInDb=_ctx.LinkRecords.ToList()代码>点击“LinkRecords.ToList”不到一秒钟。在visual studio中运行此命令时,命令的其余部分需要40秒。即使您能够快速加载所有记录,您现在也在对大量项目执行复杂的操作。我仍然建议您首先尝试在数据库中进行查询。您应该指定此查询所针对的LINQ提供程序(EF?什么版本?LINQ To SQL?或完全不同的东西?),并且您可能希望检查并发布生成/执行的SQL。您是否在\u ctx.LinkRecords
上没有调用ToList
就尝试过此查询?这将把数据库中的所有记录加载到内存中,这可能需要很长时间。通过删除它,它会将您的查询转换为SQL并在数据库中运行,这可能会更快。内存中的第二个查询远远不是最优的,而且肯定可以优化。但在这样做之前,问题是这个语句需要多少时间(从总的15秒开始)var linksInDb=_ctx.LinkRecords.ToList()代码>点击“LinkRecords.ToList”不到一秒钟。在visual studio中运行此命令时,命令的其余部分需要40秒。即使您能够快速加载所有记录,您现在也在对大量项目执行复杂的操作。我仍然建议首先在数据库中尝试查询。