C# 如何编写LINQ查询以保留最近的10个条目
我有一张表,我只想保留最近的10条记录。如果我要编写针对MySQL的查询,它将如下所示: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和实体框架,
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条记录。如果这个数字开始增长,我将在以后重新评估。