c# - 使用 LINQ to SQL 定期删除一组记录的最佳方法

标签 c# performance linq-to-sql tsql transactions

这是我第一次尝试在我的 ASP.NET 应用程序的生命周期内定期运行的方法,以清理存储在我的数据库中的过期 session 。它似乎工作得很好,但我这个软件工程师并不觉得这段代码“正确”。几个月来我一直在使用 LINQ to SQL,但我对以下代码不是很有信心。我担心一些事情:

  1. 在数据库被我的应用程序中的不同线程访问的情况下,运行以下代码是否安全?我对事务的概念有很好的理解,但我想确保我正确地使用了它们。

  2. 我的查询会导致性能问题吗?或者在这种情况下选择该特定表中的所有记录是否合适?该方法每15分钟运行一次,不会在短时间内反复查询。

  3. 有没有更好的方法可以做到这一点?我有一种挥之不去的感觉。

代码:

/// <summary>
/// Method, run periodically, to remove all sign in records that correspond to expired sessions.
/// </summary>
/// <param name="connectionString">Database connection string</param>
/// <returns>Number of expired sign in records removed</returns>
public static int Clean(String connectionString)
{
    MyDatabaseDataContext db = new MyDatabaseDataContext(connectionString);

    var signIns = db.SignIns.Select(x => x);
    int removeCount = 0;

    using (TransactionScope scope = new TransactionScope())
    {
        foreach (SignIn signIn in signIns)
        {
            DateTime currentTime = DateTime.Now;
            TimeSpan span = currentTime.Subtract(signIn.LastActivityTime);

            if (span.Minutes > 10)
            {
                db.SignIns.DeleteOnSubmit(signIn);
                ++removeCount;
            }
        }

        db.SubmitChanges();
        scope.Complete();
    }

    return removeCount;
}

最佳答案

这听起来像是您可以在存储过程中轻松完成的事情。 SQLServer 为您提供了一个返回当前时间的 GETDATE() 方法……我不明白为什么您不能这样做

 DELETE * FROM tblSignIns 
 WHERE LastActivityTime < DATEADD("minute", -10, GETDATE());

这不会做同样的事情吗?

关于c# - 使用 LINQ to SQL 定期删除一组记录的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/301965/

相关文章:

c# - 防止属性在 Web API 中被序列化

mysql - 为什么我的自定义 MySQL 函数比查询中的内联函数慢得多?

java - 当我使用 cfdocument 时,ColdFusion 挂起

.net - 为什么DataContext.Connection.ConnectionString无法获取密码

asp.net-mvc - 使用 LINQ to SQL SubmitChanges() 时,什么会导致 SqlDateTime 溢出?

linq 到 sql 连接 - ListBox 的名字和姓氏

c# - 在新窗口中显示服务器端生成的 HTML

c# - OVR 相机在预览中旋转

c# - 将抽象 C++ 结构返回到 C#

javascript - JS脚本在CodeIgniter中的放置