gpt4 book ai didi

c# - 从 using block 中返回 IQueryable。需要更好的设计

转载 作者:行者123 更新时间:2023-12-05 00:29:45 24 4
gpt4 key购买 nike

我创建了一个电话簿风格的应用程序;在我的电话簿对象上,我有一个本地成员 _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一个字段,并在您的处置方法中处置它。

然后,您将负责调用者处理他的类实例。

例如。

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 block 中返回 IQueryable。需要更好的设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17024365/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com