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

标签 c# .net sql-server performance linq

我正在使用 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;
    }
}

最佳答案

我会使用查询 #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 即可!

关于c# - 使用 Linq 更新 SQL Server 数据库的更好方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26573450/

相关文章:

c# - view, presenter 和 interface 之间的依赖关系

c# - 使用 C# 访问、阅读和删除我的网络邮件中的邮件的应用程序

.net - 为什么 ThreadPool 默认每个处理器有 250 个工作线程?

sql - 对于有很多问题的调查问卷,我应该使用什么类型的数据库设计?

c# - 在卸载 Wix 时删除整个用户帐户占用空间

c# - 按值从列表中删除项目

c# - 如何使用 ASP.NET MVC + SignalR 强制服务器不断发送事件数据?

sql-server - SQL Server 错误 "EXECUTE AS"

sql-server - 如何替换分号?

c# - MongoDB - 查看失败的命令