嵌套的Using语句会影响性能

时间:2017-11-09 12:40:09

标签: c# performance linq ado.net using

     using (var db1 = new DataBase1Entities())
        {
           using (var db2 = new DataBase2Entities())
           {
                var list = (from obj in db2.Table1
                            where !db1.Table2.Any(i => i.Table2Col == obj.Table1Col)
                            select obj).ToList();
           }
        }

有谁知道如何从一个数据库表中检索值并将其与另一个数据库表进行比较?如果上面的代码是正确的,那么它会导致性能问题吗?

2 个答案:

答案 0 :(得分:4)

你似乎不知道what a using-statement does。实际上它只是一个尝试 - 最终阻止,在最后有一个呼叫Dispose。因此,您的代码将转换为以下内容:

DataBase1Entities db1 = null;
try 
{
    db1 = new DataBase1Entities();
    DataBase1Entities db2 = null;
    try 
    {
        db2 = new DataBase2Entities()
        // do something with db2
    }
    finally 
    {
        if(db2 != null) db2.Dispose(); }
    }
}
finally
{
    if(db1 != null) db1.Dispose();
}

因此using不是Dispose可能会影响效果,也不会影响Dispose。但是你根本不应该为此烦恼,因为你来呼叫Dispose。不这样做是一个非常糟糕的主意 - 特别是如果因为任何性能问题而完成的话。 CREATE DATABASE XXX WITH ENCODING 'UTF-8' LC_COLLATE='fi_FI.UTF8' LC_CTYPE='fi_FI.UTF8' 将释放所有非托管资源,例如文件处理程序。如果你没有调用它,就没有办法释放那些可能会造成内存泄漏的资源。

答案 1 :(得分:1)

如果你愿意,你当然可以删除嵌套。像(未经测试)的东西:

HashSet<YourType> bob;

using (var db1 = new DataBase1Entities())
{
    bob = new HashSet<YourType>(db1.Table2.Select(z => z.Table2Col);
}

using (var db2 = new DataBase2Entities())
{
     var list = (from obj in db2.Table1
                 where !bob.Contains(obj.Table1Col)
                 select obj).ToList();
}

您需要对其进行分析以检查它是否更快。 许多速度优势(如果有的话)可能是由于使用HashSet而不是删除嵌套使用。