我创建了一个电话簿风格的应用程序;在我的电话簿对象上,我有一个本地成员 _site
用作过滤器,因为有大约 1000 个电话号码,分布在我组织内的 12 个站点。使用此方法一次只能检索一个站点。
这是我原来的方法。 GUI 有几种重新排序数据的方法,因此我将其保留为 IQueryable,因为我想推迟 SQL 以允许在 SQL 服务器上而不是在客户端 PC 上完成过滤。
作品
public IQueryable<PhoneNumber> GetPhoneDirectory()
{
PhoneBookDataContext db = new PhoneBookDataContext())
return db.PhoneNumbers.Where(d => d.Site == _site);
}
但是,我也试图在
using
语句方面保持“最佳实践”。不起作用
public IQueryable<PhoneNumber> GetPhoneDirectory()
{
using (PhoneBookDataContext db = new PhoneBookDataContext())
{
return db.PhoneNumbers.Where(d => d.Site == _site);
}
}
现在正如@justanotheruseryoumay 指出的那样,这将导致异常,因为数据上下文在访问对象时已被释放。
我想我要问的是,当我不能使用“使用”语句并且不严格知道上下文何时完成时,如何确保我的数据上下文得到很好的处理。
最佳答案
如果您想返回 IQueryable
,您可以将包含 GetPhoneDirectory
的类设置为一次性的,将 PhoneBookDataContext
设置为一个字段,并在您的 dispose 方法中处理它。
然后,您将负责调用者处理他的类实例。
例如。
public class MyClass : IDisposable
{
PhoneBookDataContext db;
public MyClass()
{
db = new PhoneBookDataContext();
}
public IQueryable<PhoneNumber> GetPhoneDirectory()
{
return db.PhoneNumbers.Where(d => d.Site == _site);
}
public void Dispose()
{
if (db != null)
{
db.Dispose();
db = null;
}
}
}
// Caller
using(var myClass = new MyClass())
{
var queryable = myClass.GetPhoneDirectory();
...
}
关于c# - 从 using 块中返回 IQueryable。需要更好的设计,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17024365/