C# 数据服务是否实现IDisposable?

C# 数据服务是否实现IDisposable?,c#,entity-framework,entity-framework-4,wcf-data-services,C#,Entity Framework,Entity Framework 4,Wcf Data Services,以下是一个示例服务: public class MyWcfDataService : DataService<MyEFModel> { [WebGet(ResponseFormat = WebMessageFormat.Json)] public IQueryable<GetMyListEF> GetMyList() { using (MyEfModel context = this.CurrentDataSource) {

以下是一个示例服务:

public class MyWcfDataService : DataService<MyEFModel>
{
   [WebGet(ResponseFormat = WebMessageFormat.Json)]
   public IQueryable<GetMyListEF> GetMyList()
   {
      using (MyEfModel context = this.CurrentDataSource)
      {
          return context.GetMyListEF().ToList().AsQueryable();
      }
   }
}
公共类MyWcfDataService:DataService
{
[WebGet(ResponseFormat=WebMessageFormat.Json)]
公共IQueryable GetMyList()
{
使用(MyEfModel context=this.CurrentDataSource)
{
返回context.GetMyListEF().ToList().AsQueryable();
}
}
}
我应该使用
使用
语句吗?这使得
IQueryable
变得毫无意义,因为我必须先将其强制转换为列表(我这样做是因为其他方法调用
GetMyList
方法,并且没有先强制转换为列表,数据就消失了[因为延迟执行])


我想我已经在某个地方读到(现在找不到链接)WCF数据服务没有实现IDisposable。如果这是真的,那么
using
语句是没有意义的。

using
语句将导致在
using
块的末尾处置您的
CurrentDataSource
,而不是在处置
DataService
时。因此,问题不在于
DataService
是否可
IDisposable
(它不是),而在于
MyEfModel
是否是一次性的(它是)。正如失望先生指出的,如果不是这样,编译器将阻止您使用
using
语句

这意味着创建新对象时最好使用
using
块。例如:

using (MyEfModel context = this.GetNewDataSource()) {...}
这样,您就不会遇到有人在使用块之后尝试访问
CurrentDataSource
,并遇到异常的可能性


关于IQueryable之类的其他观点,我通常没有看到WCF方法实现
IQueryable
,因为它们是通过网络连接使用的。通常首选
IEnumerable
。您并没有将查询“强制”到列表中,因为这意味着它已经在列表中。您正在评估查询以创建列表。然后,您可以将该列表强制转换为IEnumerable或IQueryable,因为该列表实现了这些接口。

我最后得出以下结论:

[WebGet(ResponseFormat = WebMessageFormat.Json)]
public IQueryable<GetMyListEF> GetMyList()
{
    return this.CurrentDataSource.GetMyListEF();
}
[WebGet(ResponseFormat=WebMessageFormat.Json)]
公共IQueryable GetMyList()
{
返回此.CurrentDataSource.GetMyListEF();
}

不需要
using
语句,因为WCF数据服务将在请求结束时处理
CurrentDataSource
。使用
IQueryable
还允许使用延迟加载或延迟执行

下面是关于这个的另一个帖子:

如果它没有公开Dispose方法,那么它就不会使用
语句编译
ToList()
迭代整个输入序列。在上调用
AsQueryable()
没有多大意义,没有任何区别。