我有一个具体的情况,我还没有找到解决方案。
我有几个具有相同结构的数据库,其中有一个表(比如说),它具有已知的列,Users
例如:UserID
、、、等...在同一个表中,我有动态自定义列,我只能在运行时知道, 如: , , , 等...UserName
UserMail
customField54
customField75
customField82
我有一个屏幕,我必须在其中显示用户列表,并且有数千条记录(必须显示所有用户 - 毫无疑问)。
数据库 A 中的 Users 表列如下所示:
| UserID | UserName | UserMail | customField54 | customField55 |
例如,假设我有另一个数据库 B,那里的表用户看起来像这样:
| UserID | UserName | UserMail | customField109 | customField211 | customField235 | customField302 |
我有一个代码,每次都连接到另一个数据库。所以我有一个代码->多个数据库,而每个数据库的区别是Users
表的自定义字段。
如果我使用 DataTable,我可以查询:
SELECT * FROM Users
然后,我可以动态检索自定义字段值,如下所示:
Dim customFieldsIDs() As Integer = GetCustomFieldsIDs()
Dim dt As DataTable = GetUserListData() // All users data in a DataTable
For Each dr In dt.Rows
Response.Write(dr.Item("UserID"))
Response.Write(dr.Item("UserName"))
Response.Write(dr.Item("UserMail"))
For Each cfID in customFieldsIDs
Response.Write(dr.Item("customField" & cfID))
Next
Next
我的意图不是使用 DataTables。我想使用强类型对象。我无法使用内部的 customFields 创建用户的 POCO,因为对于每个数据库,Users 表都有不同的 customFields 列,因此我无法创建具有强类型变量的对象。
然后,我决定创建一个包含已知列的用户类,以及一个包含 customFields 的字典。
在 VB.NET 中,我创建了一个用户类,如下所示:
Public Class User
Public Property UserID As Integer
Public Property UserName As Integer
Public Property UserMail As Integer
Public Property customFieldsDictionary As Dictionary(Of Integer, String)
End Class
该类具有静态值:UserID
,UserName
等...此外,它具有customFieldIDs
及其值的字典,因此我可以在单个操作中检索值(在 O(1) 复杂度中)
我使用 MicroORM PetaPoco\NPoco 来填充这些值。ORM 允许我获取用户数据,而无需我自己迭代数据,方法是调用:
Dim userList As List(Of User) = db.Fetch(Of User)("SELECT * FROM Users")
但是customFields
没有填充字典。为了填充,我必须迭代userList
和为每个用户检索customFields
数据。这是获取数据的一种非常昂贵的方式,并且会导致非常糟糕的性能。
我想知道是否有一种方法可以通过单个命令使用 PetaPoco\NPoco 将数据提取到 User 类中,并设法为每个用户填充已知值和自定义字段字典,而无需遍历整个集合.
我希望它被理解。这对我来说真的很难解释,也是一个很难找到解决方案的问题。