C# 使用LINQ to SQL定期删除一组记录的最佳方法
这是我第一次尝试在ASP.NET应用程序生命周期内定期运行的方法,该方法用于清理存储在数据库中的过期会话。它似乎工作得很好,但我的软件工程师对这段代码感觉不“正确”。我已经使用LINQtoSQL几个月了,但是我对下面的代码不是很有信心。我担心几件事:C# 使用LINQ to SQL定期删除一组记录的最佳方法,c#,performance,linq-to-sql,tsql,transactions,C#,Performance,Linq To Sql,Tsql,Transactions,这是我第一次尝试在ASP.NET应用程序生命周期内定期运行的方法,该方法用于清理存储在数据库中的过期会话。它似乎工作得很好,但我的软件工程师对这段代码感觉不“正确”。我已经使用LINQtoSQL几个月了,但是我对下面的代码不是很有信心。我担心几件事: 在应用程序中的不同线程访问数据库的情况下,运行以下代码是否安全?我对事务的概念有相当的理解,但我想确保我正确地使用它们 我的查询是否会导致性能问题?或者在这种情况下,选择此特定表中的所有记录是否合适?此方法仅每15分钟运行一次,因此不会在短时间内反
//
///方法,定期运行,以删除与过期会话相对应的所有登录记录。
///
///数据库连接字符串
///已删除的过期登录记录数
公共静态整型清理(字符串连接字符串)
{
MyDatabaseDataContext db=新的MyDatabaseDataContext(connectionString);
var signIns=db.signIns.Select(x=>x);
int removeCount=0;
使用(TransactionScope范围=新TransactionScope())
{
foreach(SignIn SignIn in SignIn)
{
DateTime currentTime=DateTime.Now;
TimeSpan=currentTime.Subtract(signIn.LastActivityTime);
如果(跨度分钟>10)
{
db.SignIns.deleteosubmit(signIn);
++清除计数;
}
}
db.SubmitChanges();
scope.Complete();
}
返回removeCount;
}
您可以在数据库上下文中将存储的proc作为方法。为什么不写一个你想要的,然后通过上下文调用它呢?这样,您也可以使用集合逻辑,而不是迭代集合。(Linq to SQL可能会将其编译掉-不确定它如何处理删除。)这听起来像是可以在存储过程中轻松完成的事情。SQLServer提供了一个GETDATE()方法,返回当前时间。。。我不明白你为什么不能
DELETE * FROM tblSignIns
WHERE LastActivityTime < DATEADD("minute", -10, GETDATE());
从tblSignIns中删除*
其中LastActivityTime
这不也是一回事吗?一句话:你不想要,你想要。在大多数情况下,这可能是无关紧要的,但至少是一个逻辑错误:)FWIW我不久前发布了一段示例代码,展示了Linq基于集合/批处理更新的实现(单语句更新而不是逐记录更新) 我还没有发布相同的删除版本,但很快就会发布(读:当我有心情键入另一个博客条目时:)。同时,您可以从“update”语句版本派生它 您可以在此处找到描述和源代码: 更新:可以在此处找到“删除”示例:
此外,Linq的使用需要DB服务器和应用程序之间的额外通信,这会给系统带来额外的开销。我认为,调用Select是毫无意义的。您应该能够使用“foreach(在db.SignIns中签名)”
DELETE * FROM tblSignIns
WHERE LastActivityTime < DATEADD("minute", -10, GETDATE());