C# 如何编写LINQ查询以保留最近的10个条目

C# 如何编写LINQ查询以保留最近的10个条目,c#,entity-framework,linq,C#,Entity Framework,Linq,我有一张表,我只想保留最近的10条记录。如果我要编写针对MySQL的查询,它将如下所示: DELETE FROM tblQuickLink WHERE ID NOT IN (SELECT ID from tblQuickLink ORDER BY EntryDate DESC Limit 10) 我想构造一个Linq查询,它将为我提供一个记录集合,然后通过迭代列表并发出dbContext.Delete来从目标表中删除这些记录。我不熟悉Linq和实体框架,

我有一张表,我只想保留最近的10条记录。如果我要编写针对MySQL的查询,它将如下所示:

DELETE FROM tblQuickLink 
WHERE ID NOT IN 
    (SELECT ID from tblQuickLink 
      ORDER BY EntryDate DESC 
      Limit 10)
我想构造一个Linq查询,它将为我提供一个记录集合,然后通过迭代列表并发出
dbContext.Delete
来从目标表中删除这些记录。我不熟悉Linq和实体框架,所以如果有更简单的方法来实现这一点,我会洗耳恭听

非常感谢


--Val

我不是EF专家,甚至不是初学者,但也许这会奏效:

context.RemoveRange(context.tblQuickLink.OrderByDescending(x => x.EntryDate).Skip(10));
context.SaveChanges();

查询只检索数据,所以不能删除任何内容。你需要使用RemoveRange方法。

我不是EF专家,甚至不是初学者,但也许这会奏效:

context.RemoveRange(context.tblQuickLink.OrderByDescending(x => x.EntryDate).Skip(10));
context.SaveChanges();

查询只检索数据,所以不能删除任何内容。您需要使用RemoveRange方法。

LINQ从不更改原始输入序列

只能从输入序列中提取数据。您可以具体化这些数据,并请求DbContext的数据库集删除这些元素

using (var dbContext = new MyDbContext(...))
{
    // get all but the 10 newest records
    var rowsToDelete = dbContext.QuickLinks
        .OrderByDescending(quickLink => quickLink.EntryDate)
        .Skip(10)
        .ToList();

    dbContext.QuickLinks.RemoveRange(rowsToDelete);
    dbContext.SaveChanges();
}
换句话说:MyDbContext包含一个快速链接表。此表中的每一行都有一个属性EntryDate。按EntryDate值降序排列快速链接表中的行。结果是一系列行,最新的EntryDate排在第一位。跳过此序列的前10个元素,并将其余元素放入列表中

要求快速链接删除结果列表中的所有元素,并保存更改


简单的问候

LINQ从不更改原始输入序列

只能从输入序列中提取数据。您可以具体化这些数据,并请求DbContext的数据库集删除这些元素

using (var dbContext = new MyDbContext(...))
{
    // get all but the 10 newest records
    var rowsToDelete = dbContext.QuickLinks
        .OrderByDescending(quickLink => quickLink.EntryDate)
        .Skip(10)
        .ToList();

    dbContext.QuickLinks.RemoveRange(rowsToDelete);
    dbContext.SaveChanges();
}
换句话说:MyDbContext包含一个快速链接表。此表中的每一行都有一个属性EntryDate。按EntryDate值降序排列快速链接表中的行。结果是一系列行,最新的EntryDate排在第一位。跳过此序列的前10个元素,并将其余元素放入列表中

要求快速链接删除结果列表中的所有元素,并保存更改


简单的问候

嗨,谢谢你的回复。实际上,我正在从MySQL数据库转换为SQL Server数据库。您是否建议我实际上可以直接向上下文发出上述查询?@Silvermind SQL在查询过程中是否会锁定表?即使如此,一旦查询执行,就可以立即添加新记录。我不确定这种差异是否足够重要,除非删除是后插入触发器的一部分。@Silvermind在假设这是一个问题之前,也许问问有多少记录可能会被删除是值得的。但是LINQ肯定不是万能的,有时候EF甚至更差。@Silvermind感谢LINQ带来的所有好处,例如,类型安全和标准语言使用。非常感谢大家的投入。我学到了很多,我非常感谢所有的反馈。我最终使用FromSqlRaw命令获取数据,然后发出RemoveRange命令。该表相对较小,它保存用户访问的最后10条联系人记录。我只有8个用户,所以表永远不会增长到超过80条记录。如果这个数字开始增长,我会在以后重新评估。嗨,谢谢你的回复。实际上,我正在从MySQL数据库转换为SQL Server数据库。您是否建议我实际上可以直接向上下文发出上述查询?@Silvermind SQL在查询过程中是否会锁定表?即使如此,一旦查询执行,就可以立即添加新记录。我不确定这种差异是否足够重要,除非删除是后插入触发器的一部分。@Silvermind在假设这是一个问题之前,也许问问有多少记录可能会被删除是值得的。但是LINQ肯定不是万能的,有时候EF甚至更差。@Silvermind感谢LINQ带来的所有好处,例如,类型安全和标准语言使用。非常感谢大家的投入。我学到了很多,我非常感谢所有的反馈。我最终使用FromSqlRaw命令获取数据,然后发出RemoveRange命令。该表相对较小,它保存用户访问的最后10条联系人记录。我只有8个用户,所以表永远不会增长到超过80条记录。如果这个数字开始增长,我将在以后重新评估。