将GridView绑定到IQueryable <T>

Jag*_*agd 5 gridview iqueryable asp.net-4.0 linq-to-sql

这个问题纯粹是学术性的,因为我从来没有想过在实际代码中这样做.

使用LINQ to SQL,我想绑定IQueryable<T>到GridView.我尝试使用以下代码执行此操作,但我得到了异常:

无法访问已处置的对象.对象名:'Dispose后访问的DataContext.'.

这是我的代码,它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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的代码,它将GridView绑定到返回的IQueryable<T>.

private void GetGenres() {
    gvGenre.DataSource = Genre.GetGenres2();
    gvGenre.DataBind();
}
Run Code Online (Sandbox Code Playgroud)

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

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

Pet*_*e M 16

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

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

它可以调用.ToList(),因为你实际上是在外出并获取数据,然后将内存放入.

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