我可能离这里很远,这个问题可能与主观接壤,但无论如何。
目前,我用于IList<T>
将数据库中的信息缓存在内存中,以便可以LINQ
从中查询信息。我在 SO 上的一些问题的帮助下编写了一个 ORM'ish 层,以便轻松地从数据库中查询我需要的信息。例如:
IList<Customer> customers = DB.GetDataTable("Select * FROM Customers").ToList<Customer>();
它工作正常。我还有扩展方法来对这些列表中的单个项目进行 CRUD 更新:
DB.Update<Customer>(customers(0));
再次工作得很好。
现在在我的应用程序的 GUI 层中,特别是在DataGridView
为用户绑定数据以编辑数据时,我发现自己绕过了这个 DAL 层并直接TableAdapters
在表单中使用这种打破分层架构的形式,这对我来说有点味道。我还发现我在TableAdapters
这里和ILists
那里使用的事实,在我的代码中遵循不同的标准,我想将它们合并为一个。
理想情况下,我希望能够绑定到这些列表,然后让 DAL 为我更新列表的“脏”数据。对我来说,这个过程将涉及以下内容:
- 遍历任何“脏”项目的列表
- 对于其中的每一个,查看数据库中是否已经存在具有 PK 的项目
- 如果(2),则更新,否则插入
- 最后,执行
Delete FROM * WHERE ID NOT IN('all ids in list')
查询
我不完全确定这是如何在 a 中处理的TableAdapter
,但我可以看到随着列表中项目的增加,这种方法的性能会显着下降并且很快。
所以我的问题是:
有没有更简单的方法将List提交到数据库?请注意提交一词,因为它可能是插入/更新或删除。
我应该转换为DataTable
吗?例如这里
我确信一些更高级的 ORM 会执行这种类型的事情,但是是否有任何 mini-orm(例如 dapper/Petapoco/Simple.data 等)可以为我做到这一点?我想让它保持简单(就像我当前的 DAL 一样)和灵活(如果它完全满足我的需要,我不介意编写 SQL)。