如何使用IQueryable填充dataGridView

时间:2012-09-17 19:36:18

标签: c# winforms entity-framework iqueryable

我已经添加了必需的列和正确的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();
}

1 个答案:

答案 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会有问题)。