Asp.net 如何在使用后处理数据上下文
我有一个从数据上下文返回IQueryable的成员类Asp.net 如何在使用后处理数据上下文,asp.net,datacontext,iqueryable,Asp.net,Datacontext,Iqueryable,我有一个从数据上下文返回IQueryable的成员类 public static IQueryable<TB_Country> GetCountriesQ() { IQueryable<TB_Country> country; Bn_Master_DataDataContext db = new Bn_Master_DataDataContext(); country = db.TB_Countries
public static IQueryable<TB_Country> GetCountriesQ()
{
IQueryable<TB_Country> country;
Bn_Master_DataDataContext db = new Bn_Master_DataDataContext();
country = db.TB_Countries
.OrderBy(o => o.CountryName);
return country;
}
publicstaticiqueryable GetCountriesQ()
{
宜居国家;
Bn_Master_datacontext db=新的Bn_Master_datacontext();
国家=db.TB_国家/地区
.OrderBy(o=>o.CountryName);
返回国;
}
正如您所看到的,我不会在使用后删除数据上下文。因为如果我删除它,调用此方法的代码将无法使用IQueryable(可能是因为延迟执行?)。如何强制立即执行此方法?所以我可以处理数据上下文
谢谢:D您可以将查询表转换为列表,如下所示:
public static List<TB_Country> GetCountriesQ()
{
using(var db = new Bn_Master_DataDataContext())
{
return db.TB_Countries
.OrderBy(o => o.CountryName).ToList();
}
}
公共静态列表GetCountriesQ()
{
使用(var db=new Bn\u Master\u datacontext())
{
返回db.TB_国家/地区
.OrderBy(o=>o.CountryName).ToList();
}
}
Codeka给出的示例是正确的,我建议在表示层调用该方法时使用它编写代码。然而,处理DataContext
类有点棘手,所以我想补充一些关于这方面的内容
LINQ to SQL生成的域对象(在您的例子中是tbu Countries
类)通常包含对DataContext
类的引用。延迟加载需要此内部引用。当您访问引用对象的实例列表(例如:TB\u Country.States
)时,LINQ to SQL将为您查询数据库。延迟加载的列也会发生这种情况
处置DataContext
时,会阻止再次使用它。因此,当您像在示例中那样返回一组对象时,不可能在TB\u Country
实例上调用States
属性,因为它将抛出ObjectDisposedException
这并不意味着您不应该处理DataContext
,因为我认为您应该这样做。您应该如何解决这一问题取决于您选择的体系结构,但在我看来,您基本上有两种选择:
备选案文1。为GetCountriesQ
方法提供一个DataContext
。
当您的方法是业务层中的内部方法并且是更大(业务)事务的一部分时,您通常希望这样做。当您从外部提供一个DataContext
时,它是在方法的范围之外创建的,不应该处理它。您可以将其放置在更高的层上。在这种情况下,您的方法基本上如下所示:
public static IQueryable<TB_Country> GetCountriesQ(
Bn_Master_DataDataContext db)
{
return db.TB_Countries.OrderBy(o => o.CountryName);
}
public static CountryDTO[] GetCountriesQ()
{
using (var db = new Bn_Master_DataDataContext())
{
var countries;
from country in db.TB_Countries
orderby country.CountryName
select new CountryDTO()
{
Name = country.CountryName,
States = (
from state in country.States
order by state.Name
select state.Name).ToList();
};
return countries.ToArray();
}
}
public class CountryDTO
{
public string Name { get; set; }
public List<StateDTO> States { get; set; }
}
正如您将读到的,您可以做一些聪明的事情来减少使用DTO的痛苦
我希望这有帮助。+1顺便说一句,这里的using语句将处理数据上下文(类实现IDisposable),它释放System.data.Linq.DataContext使用的所有资源。别忘了标记您最喜欢的答案。