Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Linq更新SQL Server数据库的更好方法是什么?_C#_.net_Sql Server_Performance_Linq - Fatal编程技术网

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

C# 使用Linq更新SQL Server数据库的更好方法是什么?,c#,.net,sql-server,performance,linq,C#,.net,Sql Server,Performance,Linq,我正在使用SQLServer2012和LINQtoSQL 我有这个方法在检查了一些条件后更新数据库中的一行 我用两种方式写的。哪一个更快、资源密集度更低?(SQL查询、CPU计数…) 问题#1: 在这篇文章中,我使用了IEnumerable internal static bool CheckSecretCodeLoginkError(String License, String SecretCode, DataClasses1DataContext db) { IEnumerable&

我正在使用SQLServer2012和LINQtoSQL

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

我用两种方式写的。哪一个更快、资源密集度更低?(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)
{
    // 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表达式?!?!只需使用您已有的参考
用户

为什么不自己测量一下呢?我将删除我的答案,并在这里留下一条评论:您可以自己查看Linq to SQL thank You@StephenKennedy生成的SQL
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;
    }
}