1

必要な列を追加し、適切な DataPropertyName を使用して、次のコードを使用して datagridview を設定します。ただし、私のdataGridViewは列ヘッダーと1つの空の行のみを表示します。コードの何が問題になっていますか?

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、 に入れるforeach、またはここの場合のように にバインドするDataGridView)。

この実行の遅延は、使い捨てのリソースが関係しているため、ここでは特に問題になります。usingブロックの外に出るまで、実際にはクエリを実行していません。つまり、DataSource実際にクエリを実行しようとしているときには、 が破棄されています。

この問題を解決する 1 つの方法は、クエリを積極的に実行することです。

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それは完全に冗長です。

もう 1 つのオプションは、データ ソースの範囲を拡大することです。メソッド内で宣言する代わりにkolonlistele、オブジェクトがまだ破棄されていないときにデータソースが設定されるように、データソースが「より高いスコープ」で宣言された場合も機能します。これは、データ ソースの作成にコストがかかる場合や、クエリのサイズが大きすぎてストリーミングすることが重要な場合に適しています (データをストリーミングする必要がある場合は、データを熱心に評価しListて問題)。

于 2012-09-17T19:57:01.033 に答える