問題のドメインは、〜90000行と6列のようなdbファイルがあることです。私はすべての行と列を私のために必要な取得し、それはうまく動作するSelectクエリを得ました。今私はそれらのレコードでDataTableを埋めることです。私はSQliteDataAdapterのFillメソッドでこれを行います。これには約1.3秒かかります。その後、ObservableCollection(< - DataGridにバインドされています)にこのデータを入力します。これには約1,3秒もかかります。だからここに私のコードはC#SQLiteDataAdapter Fillメソッドが遅い
private void GetSelectedMaterial()
{
DataTable dtMaterial = new DataTable();
materialColl.Clear(); // Clearing ObservableCollection
Trace.WriteLine("GetSelectedMaterial TS " + DateTime.Now + DateTime.Now.Millisecond);
using (SQLiteConnection connection = new SQLiteConnection(dbConnection))
using (SQLiteCommand cmd = connection.CreateCommand())
{
connection.Open();
query = "SELECT * FROM Tbl_Materialliste LEFT JOIN(SELECT * FROM Tbl_Besitzt k WHERE k.TechnikID = '" + teTechnikID + "') as k ON k.MaterialID = Tbl_Materialliste.MaterialID";
dataAdapter = new SQLiteDataAdapter(query, connection);
Trace.WriteLine("query: " + DateTime.Now + DateTime.Now.Millisecond);
dtMaterial.Columns.Add("Checked", typeof(bool));
Trace.WriteLine("here comes the fill: " + DateTime.Now + DateTime.Now.Millisecond);
dataAdapter.Fill(dtMaterial);
Trace.WriteLine("Checkbox: " + DateTime.Now + DateTime.Now.Millisecond);
DetermineCheckBox(dtMaterial, teTechnikID, 8);
Trace.WriteLine("SQL TS: " + DateTime.Now + DateTime.Now.Millisecond);
}
FillMaterialColl(dtMaterial);
}
private void FillMaterialColl(DataTable dtMaterial)
{
foreach (DataRow dr in dtMaterial.Rows)
{
Material mat = new Material();
mat.isChecked = (bool)dr.ItemArray[0];
mat.materialID = (string)dr.ItemArray[1];
mat.materialkurztext = (string)dr.ItemArray[2];
mat.herstellername = (string)dr.ItemArray[3];
mat.herArtikenummer = (string)dr.ItemArray[4];
mat.dokument = (string)dr.ItemArray[5];
mat.substMaterial = (string)dr.ItemArray[6];
materialColl.Add(mat);
}
}
である私はObservableCollectionsがパフォーマンスを排出している知っているが、別の方法でこれを行うにはいくつかの方法がありますか?一部の人はDataAdapterの代わりにDataReaderを使用すると言いますが、DataAdapterはDataReaderを使用するため、パフォーマンスの向上はないと思います。
:だから、主な問題は、そのプロセスが長いにかかり、新しい材料を示すことは約3~4秒かかる場合、ユーザーエクスペリエンスがあまり良くないということです。..EDIT だからここに私のDB設計が来ます
それはTbl_MaterialとTbl_Technikの多対多の関係です。 私の選択クエリは、Tbl_Material(〜90k)のすべてのエントリと、Tbl_Besitztからのこれらのカラムを提供します。technikID を見つけることができます。チェックボックス)、私のMaterialIDに属する項目 Tbl_Materiallisからの私のDBファイルMaterialId teはPKでTbl_TechnikのTechnikIDです - あなたがデザインイメージに疑問を持っているわけではありません。私はそれらをモデルに入れませんでした。
ありがとう!
はい、そうですが、バックグラウンドスレッドなしでこれを行うと変更されません...スレッドを必要としないようにコードを編集します。 – user8574993