2011-12-23 10 views
0

に私はリストとdataGridView1を持っていると私はこれをやろうとしている:それは結構コンパイルLINQの一覧<T>からのDataGridView

var result = from s in sessions 
      where s.ID > 0 
      select s; 
dataGridView1.DataSource = result; 

、何ものDataGridViewと例外なくで示しています。

ただし、私がdataGridView1.DataSource = sessions;と設定すると、すべてが表示されます。

+1

idが0より大きいセッションがありますか?コードをデバッグしてresultを参照するとどうなりますか?List()? –

+0

はい、where句を削除しても何も変わりません。 result.ToList()は何も変更しません。 – OMGKurtNilsen

+0

'BindingSource'で試しましたか? – StaWho

答えて

2

Doが:あなたには、いくつかのデータをフェッチするまで

var result = from s in sessions 
      where s.ID > 0 
      select s; 
dataGridView1.DataSource = result.ToList(); 

ためlinq deferred executionの実際には、あなたのLINQクエリは実行されません。

ToListを追加しても何も表示されない場合は、結果がなく何も間違っていないことを意味します。デバッグモードのウォッチウィンドウでresult.ToList()を確認してください。何も結果がない場合は表示されますデータグリッドビューをリフレッシュするか、または再バインドする必要があります。

+0

彼はToList()がうまくいかなかったという彼のコメントで述べました。 –

+0

@WouterdeKort質問に対する私の答えは正しいです、そして、コメントは質問の一部ではありません(私はそれを見ませんでした)彼は別の問題があるかもしれません。 –

2

私は、これはトリックを行うかもしれないと思う:

dataGridView1.DataSource = result.AsDataView(); 
0

私はちょうどdataGridView1.DataSource = result.ToList()を使用してシナリオを試してみました。結果は直接動作しません。 DataGridViewは、IEnumerable(Linqステートメントの結果)に直接バインドするようには設計されていないようです。

+1

実際にはクエリを作成したとき(例の場合)、実行しなかったため、linqはlinqクエリの実行を延期し、フェッチしたいときに 'result'変数を使用します。これは単なるクエリではないオブジェクトです。たとえば、大きなデータベースの大きなクエリでこれをデバッグすると、非常に高速にブレークポイントが渡されますが、 '.ToList()'を追加すると十分速く動作します。 [linq deferred execution](http://blogs.msdn.com/b/charlie/archive/2007/12/09/deferred-execution.aspx)を参照してください。 –

+0

論理的な説明は、私が伝えたいものです。 IQueryableはIEnumerableから派生しているため、IEnumerableという名前になっています。 (http://msdn.microsoft.com/en-us/library/bb351562.aspx) – Mzn

+0

@SaeedAmiri、私の答えは正しいです。 – Mzn