2009-07-15 14 views
0

対収集の負荷私は亜音速コレクションに亜音速 - クエリ

 TcolorCollection tc = new TcolorCollection().Load(); 
     dataGridView1.DataSource = tc; 

をDataGridViewのデータソースを設定していると私は、以前のコードはずっと(ずっとへの道)以下

その後、遅くなることに気付きました
 SubSonic.Query q3 = new SubSonic.Query("tcolor"); 
     q3.QueryType = SubSonic.QueryType.Select; 
     IDataReader reader = q3.ExecuteReader(); 
     DataTable dt = new DataTable(); 
     dt.Load(reader); 
     dataGridView1.DataSource = dt; 

私はコレクションクラスとその接続性を使いたいですが、.Load()を高速化する方法が必要です。

私が使用しているテーブルには8000以上のレコードがあります。小さくないが、巨大ではない。思考の

答えて

1

カップル...

あなたはDataSetを使用する必要がある場合/ DataTableのはあなただけのこの操作を行うこともできます。

grid.DataSource =新しいSelect()( "TColorの")からExecuteDataSet ();

あなたが上に示したものはどちらも、同じコアビットを使用しています - なぜ他のものより遅いのかわかりません。

0

TcolorCollection()。Load()は8000個のTcolorオブジェクトを作成し、それらをリストに追加します。 私の経験から、1000を超えるレコードが必要な場合は、コレクションを使用することはお勧めできません。

Robが提案したように、ExecuteDataSet()は高速です。

またはExecuteTypedList()を使用して、独自のpocoクラスにクエリをマップし、必要なSubSonic機能でそれを飾ることができます。

public class TestPoco() 
{ 
    public int Id {get;set;} 
    public String Name {get;set;} 

    public bool IsNew { get { return Id == 0 } }; 
    public void Delete() 
    { 
     // Test is an SubSonic IActiveRecord Object 
     Test.Destroy(Id); 
    } 
} 

private void MyTask() 
{ 
    List<TestPoco> list = 
      DB.Select("Id", "Name").From<Test>().ExecuteTypedList<TestPoco>(); 

    foreach (var item in list) 
    { 
     if (item.Name.Contains("acme")) 
      item.Delete(); 
    } 
} 

は、ネイティブDBアクセスの実行時間に非常に近い必要があります。