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

C# 使用LINQ to SQL定期删除一组记录的最佳方法,c#,performance,linq-to-sql,tsql,transactions,C#,Performance,Linq To Sql,Tsql,Transactions,这是我第一次尝试在ASP.NET应用程序生命周期内定期运行的方法,该方法用于清理存储在数据库中的过期会话。它似乎工作得很好,但我的软件工程师对这段代码感觉不“正确”。我已经使用LINQtoSQL几个月了,但是我对下面的代码不是很有信心。我担心几件事: 在应用程序中的不同线程访问数据库的情况下,运行以下代码是否安全?我对事务的概念有相当的理解,但我想确保我正确地使用它们 我的查询是否会导致性能问题?或者在这种情况下,选择此特定表中的所有记录是否合适?此方法仅每15分钟运行一次,因此不会在短时间内反

这是我第一次尝试在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());