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

3

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

1
为什么不自己测量呢? - Dmitry
我将删除我的答案并在此处留下评论:你可以自己查看由Linq to SQL生成的SQL。https://dev59.com/p3PYa4cB1Zd3GeqPhEgZ#17092821 - Stephen Kennedy
1个回答

1
我会使用查询#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就可以了!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接