我创建了一个电话簿风格的应用程序;在我的电话簿对象上,我有一个本地成员 _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/

10-17 02:32