这个问题纯粹是学术性的,因为我从没想过在真正的代码中这样做。

使用 LINQ to SQL,我想绑定(bind)一个 IQueryable<T>到 GridView。我尝试使用以下代码执行此操作,但出现异常:

Cannot access a disposed object. Object name: 'DataContext accessed after Dispose.'.



这是我的代码,得到 IQueryable<tabGenre>使用 LINQ to SQL:
public static IQueryable<lu_Genre> GetGenres2() { 
    using (BooksContextDataContext ctx = new BooksContextDataContext()) { 
        IQueryable<tabGenre> iq = from g in ctx.tabGenre 
                                  select g; 
        return iq; 
    } 
} 

这是我将 GridView 绑定(bind)到返回的 IQueryable<T> 的代码.
private void GetGenres() { 
    gvGenre.DataSource = Genre.GetGenres2(); 
    gvGenre.DataBind(); 
} 

那么为什么这不起作用呢?我可以只是一个 .ToList<tabGenre>() ,返回它,绑定(bind)到它,然后它就可以工作了,但是为什么 IQueryable 不能以同样的方式工作呢?我在这里真正想要实现的是了解 IQueryable 可以做什么。

编辑:
我也尝试禁用延迟加载,但没有影响。

请您参考如下方法:

您可以将 IQueryable 视为执行查询所需的指令。当您调用 .ToList() 时,您正在执行 IQueryable() 以返回实际数据。当您绑定(bind)到 IQueryable() 时,只要调用 DataBind(),它就会期望有一个数据源来获取实际数据。

当您设置 gvGenre.DataSource() = Genre.GetGenres2() 时,根据您的 IQueryable 获取实际数据所需的 DataContext 在调用 DataBind() 之前被销毁。

如果您调用 .ToList() 它会起作用,因为您实际上要出去获取数据,然后将其放入内存中。

存储 IQueryable 就像只存储查询。如果预期使用的数据源不存在,则无法执行查询。


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!