私はここからかなり離れているかもしれませんし、この質問はおそらく主観的なものに近いかもしれませんが、とにかくここに行きます.
現在IList<T>
、データベースからの情報をメモリにキャッシュするために使用しているためLINQ
、それらから情報を照会するために使用できます。DBから必要な情報を簡単に照会するために、SOに関するいくつかの質問の助けを借りて作成したORM風のレイヤーがあります。例えば:
IList<Customer> customers = DB.GetDataTable("Select * FROM Customers").ToList<Customer>();
正常に動作しています。これらのリスト内の単一のアイテムに対して CRUD 更新を行う拡張メソッドもあります。
DB.Update<Customer>(customers(0));
再び非常にうまく機能しています。
今、私のアプリの GUI レイヤーで、具体的にDataGridView
はユーザーがデータを編集するためにバインドするときに、この DAL レイヤーをバイパスしTableAdapters
、フォーム内で直接使用していることに気付きました。TableAdapters
また、あちこちで使用しているという事実も発見しましたILists
.1つに統合したいコード全体で異なる標準に従っています。
理想的には、これらのリストにバインドしてから、DAL にリストの「ダーティ」データを更新してもらいたいと考えています。私にとって、このプロセスには次のものが含まれます。
- 「汚れた」アイテムのリストをたどる
- これらのそれぞれについて、DB に PK を持つアイテムが既に存在するかどうかを確認します。
- (2) の場合は更新、そうでない場合は挿入
- 最後に、
Delete FROM * WHERE ID NOT IN('all ids in list')
クエリを実行します
これが でどのように処理されるかは完全にはわかりませんがTableAdapter
、リスト内の項目が増えると、このメソッドのパフォーマンスが大幅かつ急速に低下することがわかります。
だから私の質問はこれです:
リストをデータベースにコミットする簡単な方法はありますか? 挿入/更新または削除の可能性があるため、commit という単語に注意してください。
に変換する必要がありDataTable
ますか?例えばここ
より高度なORMのいくつかはこの種のことを実行すると確信していますが、これを実行できるミニORM(dapper/Petapoco/Simple.dataなど)はありますか?シンプルに (現在の DAL と同じように) 柔軟に (必要なものが正確に得られるのであれば、SQL を記述してもかまいません) 維持したいと考えています。