Asp.net 如何在使用后处理数据上下文

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

我有一个从数据上下文返回IQueryable的成员类

    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使用的所有资源。别忘了标记您最喜欢的答案。