以下是一个示例服务:
public class MyWcfDataService : DataService<MyEFModel>
{
[WebGet(ResponseFormat = WebMessageFormat.Json)]
public IQueryable<GetMyListEF> GetMyList()
{
using (MyEfModel context = this.CurrentDataSource)
{
return context.GetMyListEF().ToList().AsQueryable();
}
}
}
我应该使用using
声明吗?它有点让IQueryable
毫无意义,因为我必须首先将它强制转换为List(我之所以这样做是因为其他方法调用GetMyList
方法并且没有首先转换为列表,因此数据已经消失[因为延迟执行])
我以为我已经在某处找到了(现在找不到链接)WCF数据服务没有实现IDisposable。如果这是真的那么using
语句是没有意义的。
答案 0 :(得分:2)
using
语句会导致您的CurrentDataSource
被置于using
块的末尾,而不会放置DataService
。因此,问题不在于DataService
是IDisposable
(它不是),而是MyEfModel
是否是一次性的(它是)。正如Disappointment先生指出的那样,如果不是这样的话,编译器会阻止你使用using
语句。
这意味着在创建新对象时最好使用using
块。例如:
using (MyEfModel context = this.GetNewDataSource()) {...}
这样你就不会遇到有人在使用块之后尝试访问CurrentDataSource
并遇到异常的可能性。
关于你关于IQueryable等的另一点,我通常没有看到WCF方法实现IQueryable<>
,因为它们是通过网络连接消耗的。通常IEnumerable<>
是首选。并且您不是将您的查询“转换”到List,因为这意味着它已经在列表中。您正在评估查询创建列表。然后,您可能将该
答案 1 :(得分:0)
我最终选择了这个:
[WebGet(ResponseFormat = WebMessageFormat.Json)]
public IQueryable<GetMyListEF> GetMyList()
{
return this.CurrentDataSource.GetMyListEF();
}
不需要using
语句,因为WCF数据服务将在请求结束时部署CurrentDataSource
。使用IQueryable
还允许使用延迟加载,即延迟执行。
这是另一篇文章: Proper way to return IQueryable using WCF Data Service and EF