Linq to sql 将GridView绑定到IQueryable<;T>;
这个问题纯粹是学术性的,因为我从来没有梦想过在真实的代码中这样做 使用LINQtoSQL,我想将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
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();
}