我已经添加了必需的列和正确的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();
}
答案 0 :(得分:5)
这里的问题是延迟执行。 result
实际上不是结果。这不是查询的结果,而只是查询本身。那就是IQueryable
。您可以将其视为SQL查询的复杂版本,而不是结果集。在迭代它或使用迭代它的某个方法之前,不会执行实际的查询。 (例如,调用ToList
,将其放在foreach
中,或者就像这里的情况一样,将其绑定到DataGridView
。
这种延迟执行在这里特别成问题,因为涉及一次性资源。在您不在using
块之前,您实际上并没有执行查询,这意味着在您实际尝试执行查询时已经处理了DataSource
。
解决此问题的一种方法是急切地执行查询:
public static IQueryable<Kolon> kolonlistele()
{
using (Pehlivan.pehkEntities ctx = new Pehlivan.pehkEntities())
{
return ctx.Kolons.ToList();
}
}
通过调用ToList
中的using
,在处理数据源之前执行查询。还要注意我删除了from k in ctx.Kolons select k
,因为它实际上没有完成任何事情;这完全是多余的。
您的另一个选择是增加数据源的范围。如果不是在kolonlistele
方法中声明它,而是在“更高范围”声明数据源,以便在对象尚未处理时设置数据源,那么它也可以工作。这在数据源创建成本较高的情况下,或者当查询的大小非常大以至于对其进行流式处理时(如果您需要流式传输数据然后急切地将其评估为{{1会有问题)。