oData 查询和 Disposable SQL 连接

oData queries and Disposable SQL connection

使用 WebApi 2.0 实现 oData 服务时,标准做法是将服务中的 IQueryable 公开给 ApiController 的操作。这样框架就可以将 oData 查询应用于您的 IQueryable。

我目前正在阅读有关始终在数据库连接上调用 Dispose 的重要性等内容。最好使用像这样的 "using" 语句:

using (SqlConnection connection = new SqlConnection(connectionString))
{
     connection.Open();
     // Execute operations against the database
} // Connection is automatically closed.

我的问题是:在oData的情况下,什么时候关闭数据库连接?在框架应用 oData 查询之前,您显然不能自己处理连接——这会引发异常。

附带话题是:您是否同意从您的服务中公开 IQueryable<>?我读过这个,这是一个长期争论的问题——人们认为数据库工作应该包含在存储库中,而其他人则喜欢给服务的客户提供查询的自由。我同意在存储库中包含查询,但在 oData 的情况下,我不想让事情过于复杂,如果框架支持 IQueryable,那么我给它 IQueryable。你怎么看 ?

通常在这种情况下,数据库连接会在 asp.net 控制器实例被释放时关闭。假设您使用 Entity Framework 上下文进行查询。然后您在需要时创建(可能是懒惰地)该上下文实例,然后覆盖 ODataController 的 Dispose 方法并将其放置在那里。例如,看看这篇文章:http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/odata-v4/create-an-odata-v4-endpoint.

我个人从不使用这种方法,因为我更喜欢对允许的操作进行更多控制。但是,在某些情况下,通过描述的 IQueryable 方法允许对某些表进行读取访问并没有什么害处——在客户端上的情况下,您有丰富的过滤可能性。在这种情况下,无论如何你都会重新发明这种方法,因为你会使用一些自定义过滤器,或者接受很多参数到你的查询方法。