0

我可能离这里很远,这个问题可能与主观接壤,但无论如何。

目前,我用于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 为我更新列表的“脏”数据。对我来说,这个过程将涉及以下内容:

  1. 遍历任何“脏”项目的列表
  2. 对于其中的每一个,查看数据库中是否已经存在具有 PK 的项目
  3. 如果(2),则更新,否则插入
  4. 最后,执行Delete FROM * WHERE ID NOT IN('all ids in list')查询

我不完全确定这是如何在 a 中处理的TableAdapter,但我可以看到随着列表中项目的增加,这种方法的性能会显着下降并且很快。

所以我的问题是:

有没有更简单的方法将List提交到数据库?请注意提交一词,因为它可能是插入/更新或删除。

我应该转换为DataTable吗?例如这里

我确信一些更高级的 ORM 会执行这种类型的事情,但是是否有任何 mini-orm(例如 dapper/Petapoco/Simple.data 等)可以为我做到这一点?我想让它保持简单(就像我当前的 DAL 一样)和灵活(如果它完全满足我的需要,我不介意编写 SQL)。

4

1 回答 1

1

目前我使用 IList 将数据库中的信息缓存在内存中,因此我可以使用 LINQ 从它们中查询信息。

Linq 还有一个叫做 Linq-to-Datasets 的部门,所以这不是一个令人信服的理由。

更好地决定你真正想要/需要什么:

  • 像实体框架一样的完整 ORM
  • 将 DataSet 与 DataDapters 一起使用
  • 使用基本的 ADO.NET(DataReader 和 List<>)并实现您自己的更改跟踪。

您可以在某种程度上混合它们,但就像您指出的那样,最好选择一个。

于 2012-10-10T13:58:29.503 回答