Has*_*san 1 c# entity-framework iqueryable winforms
我已经添加了必需的列和正确的DataPropertyName,我使用以下代码来填充datagridview.但是,我的dataGridView仅显示列标题和一个空行.我的代码出了什么问题?
public static IQueryable<Kolon> kolonlistele()
{
using (Pehlivan.pehkEntities ctx = new Pehlivan.pehkEntities())
{
var result = from k in ctx.Kolons
select k;
return result;
}
}
private void Form1_Load(object sender, EventArgs e)
{
dataGridView1.DataSource = veritabani_islemleri.kolonlistele();
}
Run Code Online (Sandbox Code Playgroud)
这里的问题是延迟执行. result实际上不是结果.这不是查询的结果,而只是查询本身.这就是现在的样子IQueryable.您可以将其视为SQL查询的复杂版本,而不是结果集.在迭代它或使用迭代它的某个方法之前,不会执行实际的查询.(例如,调用ToList,将其置于a中foreach,或者就像这里的情况一样,将其绑定到a DataGridView).
这种延迟执行在这里特别成问题,因为涉及一次性资源.在实际执行查询之前,您实际上并没有执行查询,直到您在using块之外,这意味着DataSource已经处理了该查询.
解决此问题的一种方法是急切地执行查询:
public static IQueryable<Kolon> kolonlistele()
{
using (Pehlivan.pehkEntities ctx = new Pehlivan.pehkEntities())
{
return ctx.Kolons.ToList();
}
}
Run Code Online (Sandbox Code Playgroud)
通过调用ToList 内部的的using所述查询数据源被设置之前被执行.还要注意我删除了from k in ctx.Kolons select k因为它实际上没有完成任何事情; 这完全是多余的.
您的另一个选择是增加数据源的范围.如果不是在kolonlistele方法内声明它,而是在"更高的范围"声明数据源,以便在对象尚未处理时设置数据源,那么它也可以工作.这在数据源创建成本较高的情况下,或者当查询的大小非常大以至于对其进行流式处理时(如果您需要流式传输数据然后急切地List将其评估为一个数据源)将更加合适.问题).
| 归档时间: |
|
| 查看次数: |
4274 次 |
| 最近记录: |