C# 如何加快linq语句的速度,该语句检查两个列表中是否有丢失的记录

C# 如何加快linq语句的速度,该语句检查两个列表中是否有丢失的记录,c#,linq,C#,Linq,我正在努力实现的目标 我正在处理一个协调过程,需要确保我的数据库表具有正确的条目。我需要在主列表之外的表中查找记录。当我找到这些条目时,我需要对它们进行分组,并在每组中查找最新的条目。如果最新条目的操作字段定义为“已添加”,我将需要添加其他记录,其操作字段标记为“已删除”,因为它们未在主列表中定义 我编写的代码选择数据库中不在主列表中的记录。然后,它对这些项目进行分组和排序,最后选择每组中的第一个项目,这将是每组中最新的项目。然后,我只返回操作定义为“Added”的项。我已经针对我的单元测试和“

我正在努力实现的目标

我正在处理一个协调过程,需要确保我的数据库表具有正确的条目。我需要在主列表之外的表中查找记录。当我找到这些条目时,我需要对它们进行分组,并在每组中查找最新的条目。如果最新条目的操作字段定义为“已添加”,我将需要添加其他记录,其操作字段标记为“已删除”,因为它们未在主列表中定义

我编写的代码选择数据库中不在主列表中的记录。然后,它对这些项目进行分组和排序,最后选择每组中的第一个项目,这将是每组中最新的项目。然后,我只返回操作定义为“Added”的项。我已经针对我的单元测试和“真实”数据运行了这段代码。虽然它可以工作,但在运行一个包含16000条记录的数据库时(在VisualStudio中运行时),它的速度非常慢,可能需要40秒。是否有人可以建议修改我的代码以提高速度

下面显示的是查找不匹配记录的代码

        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秒。即使您能够快速加载所有记录,您现在也在对大量项目执行复杂的操作。我仍然建议首先在数据库中尝试查询。