1

我添加了必需的列和正确的 DataPropertyName s,我使用以下代码填充 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();
}
4

1 回答 1

5

这里的问题是延迟执行。 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();
    }
}

通过调用ToList 内部查询在using数据源被处理之前执行。另请注意,我删除了,from k in ctx.Kolons select k因为它实际上并没有完成任何事情;这完全是多余的。

您的另一个选择是增加数据源的范围。如果不是在kolonlistele方法内部声明它,而是在“更高范围”声明数据源,以便在对象尚未释放时设置数据源,那么它也可以工作。这在数据源创建成本更高的情况下更合适,或者当查询的大小如此之大以至于流式传输它很重要(如果您需要流式传输数据然后急切地将其评估为 aList将是问题)。

于 2012-09-17T19:57:01.033 回答