Linq to sql 将GridView绑定到IQueryable<;T>;

Linq to sql 将GridView绑定到IQueryable<;T>;,linq-to-sql,gridview,asp.net-4.0,iqueryable,Linq To Sql,Gridview,Asp.net 4.0,Iqueryable,这个问题纯粹是学术性的,因为我从来没有梦想过在真实的代码中这样做 使用LINQtoSQL,我想将IQueryable绑定到GridView。我尝试使用以下代码执行此操作,但出现异常: 无法访问已释放的对象。 对象名称:“在Dispose之后访问的DataContext.” 下面是我的代码,它使用LINQ to SQL获取一个IQueryable: public static IQueryable<lu_Genre> GetGenres2() { using (BooksCon

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

使用LINQtoSQL,我想将
IQueryable
绑定到GridView。我尝试使用以下代码执行此操作,但出现异常:

无法访问已释放的对象。 对象名称:“在Dispose之后访问的DataContext.”

下面是我的代码,它使用LINQ to SQL获取一个
IQueryable

public static IQueryable<lu_Genre> GetGenres2() {
    using (BooksContextDataContext ctx = new BooksContextDataContext()) {
        IQueryable<tabGenre> iq = from g in ctx.tabGenre
                                  select g;
        return iq;
    }
}
那么为什么这不起作用呢?我只需要一个
.ToList()
,返回它,绑定到它,然后它就可以工作了,但是为什么IQueryable不能以同样的方式工作呢?我真正想做的是理解IQueryable能做什么

编辑:
我还尝试禁用延迟加载,但没有效果

使用块的唯一效果是将
ctx
的寿命限制在块本身

iq
的有效寿命取决于
ctx
的寿命。在使用
iq
之前,您明确地处理了
ctx


解决此问题的方法是去掉using块,或者强制
iq
在块内求值(例如
iq=iq.ToList()
),并仅返回该求值的结果。如果你不喜欢做后者,就放弃使用
ctx
将在无人需要后的某个时间处理掉。也许并不完美,但这就是生活中的垃圾收集器。你确定如果它继续存在会产生问题吗?不要修复尚未显示为损坏的内容

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

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

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

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

public IQueryable MembershipGetAll()
    public IQueryable MembershipGetAll()
    {


            var obj = (from mem in db.GetTable<MEMBERSHIP>()
                           select new
                           {
                               NAME = mem.MEMBERSHIP.NAME,
                               TYPE = mem.MEMBERSHIP.TYPE,
                               TAX_ID = mem.TAX_RATE.TAX_ID,
                               DISCOUNT = mem.DISCOUNT,
                               DISCOUNT_PERCENT = mem.DISCOUNT_PERCENT,

                           }
                          ).AsQueryable();
            return obj;

    }


private void LoadMembership()
{
    IQueryable mem = null;
    mem = eb.MembershipGetAll();
    grdMembership.DataSource = mem;
    grdMembershipRates.DataBind();
}
{ var obj=(来自db.GetTable()中的mem) 选择新的 { NAME=mem.MEMBERSHIP.NAME, TYPE=mem.MEMBERSHIP.TYPE, TAX\u ID=mem.TAX\u RATE.TAX\u ID, 折扣=成员折扣, 折扣率=成员折扣率, } ).AsQueryable(); 返回obj; } 私有成员资格() { IQueryable mem=null; mem=eb.MembershipGetAll(); grdMembership.DataSource=mem; grdmembershipprates.DataBind(); }

就这样做吧

谢谢你的意见。我知道,摆脱使用积木确实可以解决问题。我试过了,效果不错,但我不太喜欢让GC为我清理DataContext。实际上,我甚至试着在返回之前加载IQ,希望它能起作用,但没有。在这一点上,我开始怀疑IQ可能会无限期地与DataContext联系在一起,但我想与StackOverflow的精明成员核实一下,以确保这一点。再次感谢。这对我来说很有意义。实际上,我必须向一些同事解释这一点,你们的解释是教科书,所以我会用它。谢谢
    public IQueryable MembershipGetAll()
    {


            var obj = (from mem in db.GetTable<MEMBERSHIP>()
                           select new
                           {
                               NAME = mem.MEMBERSHIP.NAME,
                               TYPE = mem.MEMBERSHIP.TYPE,
                               TAX_ID = mem.TAX_RATE.TAX_ID,
                               DISCOUNT = mem.DISCOUNT,
                               DISCOUNT_PERCENT = mem.DISCOUNT_PERCENT,

                           }
                          ).AsQueryable();
            return obj;

    }


private void LoadMembership()
{
    IQueryable mem = null;
    mem = eb.MembershipGetAll();
    grdMembership.DataSource = mem;
    grdMembershipRates.DataBind();
}