C# 带Linq的BLToolkit——为什么需要一个'using'语句?

C# 带Linq的BLToolkit——为什么需要一个'using'语句?,c#,asp.net,linq,using,bltoolkit,C#,Asp.net,Linq,Using,Bltoolkit,鉴于亚音速3最近(极端)的性能问题,我们正在考虑迁移ORMs,最好是重写尽可能少的代码(主要是Linq) 所以我在看BLToolkit。不过,我看到亚音速和BLToolkit之间的一个主要区别是BLToolkit总是需要一个using语句。例如: static void SingleTableTest() { using (var db = new NorthwindDB()) //This { var query = from e in

鉴于亚音速3最近(极端)的性能问题,我们正在考虑迁移ORMs,最好是重写尽可能少的代码(主要是Linq)

所以我在看BLToolkit。不过,我看到亚音速和BLToolkit之间的一个主要区别是BLToolkit总是需要一个
using
语句。例如:

static void SingleTableTest()
{
    using (var db = new NorthwindDB()) //This
    {
        var query =
            from e in db.Employee
            where e.EmployeeID > 5
            orderby e.LastName, e.FirstName
            select e;

        foreach (var employee in query)
        {
            Console.WriteLine("{0} {1}, {2}", employee.EmployeeID, employee.LastName, employee.FirstName);
        }
    }
}

这到底是干什么的?创建数据库的新实例时,是否会创建新连接?将其“包装”到一个静态类中是否合理,这样我就可以在数据库中的任意位置执行
var q=from e.Employee…
?这在web应用程序的上下文中会有什么影响?

我不知道BLToolkit,但从您的评论中可以看出,您想知道是否可以在每个HTTP请求中使用一个对象,并且可以使用实体框架之类的东西。在global.asax的应用程序_BeginRequest事件中创建db对象,而不是using语句。您可以在应用程序请求中处理它。您可以将对象存储在HttpContext.Current.Items中,这是一个方便的每个请求集合


正如我所说,我不知道这是否适用于BLToolkit,因为我对它一无所知,但希望它足以为您指明正确的方向。:)

我猜您示例中的NorthwindDB类是基于DbManager的。DbManager是连接的包装器,其行为类似于连接。您应该尝试另一个类-DataContext。它完全是为您的场景而设计的。

这与连接的范围应尽可能小的工作单元有关。我对这个框架不太熟悉,但很可能他们正在为您管理连接,就像EF或LinqToSql一样。根据我对代码的看法,每个
new db
语句都会创建一个新连接。我查看了亚音速,他们使用了自制的“SharedConnectionScope”,以便自动打开和关闭连接。这可能每次都会创建一个数据库连接对象的新实例,但不应该创建到数据库服务器的全新网络连接。NET默认情况下不进行连接池。@Joe,那么这不是一件大问题吗?也就是说,每个HTTP请求生成多个数据库对象?(当然,如果可能,最好使用相同的连接)连接池将在可能时考虑使用相同的网络连接。但是您需要使用块执行
,以便连接池知道您已经完成了第一个连接对象(以及它封装的网络连接),并且可以重用它。看起来您可以做到这一点。。大概问题是只有当它保持SqlReader的打开状态时。我可能会更幸运地尝试它,看看是否有什么方法可以让T4模板(BLtoolkit中包含的模板)生成一个扩展的DataContext,类似于DbManager的扩展方式?在模板中只需添加BaseDataContextClass=“DataContext”;加载元数据()之前;/GenerateModel();