使用Linq更新SQL Server数据库的更好方法是什么

本文关键字:更好 方法 是什么 数据库 Server Linq 更新 SQL 使用 | 更新日期: 2023-09-27 18:27:49

我使用的是SQL Server 2012和Linq to SQL。

我有这个方法在检查了一些条件后更新数据库中的一行。

我用两种方式写的。哪一个更快、资源密集度更低?(SQL查询,CPU计数…)

查询#1:

在这一次中,我使用了IEnumerable

internal static bool CheckSecretCodeLoginkError(String License, String SecretCode, DataClasses1DataContext db)
{
    IEnumerable<User> user = db.Users.Where(a => a.Licensekey == License).Select(a => a);
    if (SecretCode != user.First().SecretCode && !user.First().SkipSecretCode)
    {
        if (user.First().LastSecretChangeDate > DateTime.UtcNow - TimeToPreventSecretCodeChange)
        {
            //secret error
            return true;
        }
        else
        {
            //no error
            //update secret code and last change
            user.First().LastSecretChangeDate = DateTime.UtcNow;
            user.First().SecretCode = SecretCode;
            db.SubmitChanges();
            return false;
        }
    }
    else
    {
        return false;
    }
}

查询#2:

internal static bool CheckSecretCodeLoginkError(String License, String SecretCode, DataClasses1DataContext db)
{
    User user = db.Users.Where(a => a.Licensekey == License).Single();
    if (SecretCode != user.SecretCode && !user.SkipSecretCode)
    {
        if (user.LastSecretChangeDate > DateTime.UtcNow - TimeToPreventSecretCodeChange)
        {
            //secret error
            return true;
        }
        else
        {
            //no error
            //update secret code and last change
            db.Users.Where(a => a.Licensekey == License).Select(a => a).First().LastSecretChangeDate = DateTime.UtcNow;
            db.Users.Where(a => a.Licensekey == License).Select(a => a).First().SecretCode = SecretCode;
            db.SubmitChanges();
            return false;
        }
    }
    else
    {
        return false;
    }
}

使用Linq更新SQL Server数据库的更好方法是什么

我会使用带有自适应的查询#2:

internal static bool CheckSecretCodeLoginkError(String License, String SecretCode, DataClasses1DataContext db)
{
    // you store a reference in "user" here.....
    User user = db.Users.Where(a => a.Licensekey == License).Single();
    if (SecretCode != user.SecretCode && !user.SkipSecretCode)
    {
        if (user.LastSecretChangeDate > DateTime.UtcNow - TimeToPreventSecretCodeChange)
        {
            //secret error
            return true;
        }
        else
        {
            //no error
            //update secret code and last change
            // **REUSE** that reference you stored above!! 
            // Don't call .Where(...).Select(....).First() again!
            user.LastSecretChangeDate = DateTime.UtcNow;
            user.SecretCode = SecretCode;
            db.SubmitChanges();
            return false;
        }
    }
    else
    {
        return false;
    }
}

您将在方法开始时找到的单个用户存储在user中——为什么在更新时再次调用整个混乱的LINQ表达式?!?!只要使用您已经拥有的引用user即可!