1

我有一个具体的情况,我还没有找到解决方案。

我有几个具有相同结构的数据库,其中有一个表(比如说),它具有已知的列,Users例如:UserID、、、等...在同一个表中,我有动态自定义列,我只能在运行时知道, 如: , , , 等...UserNameUserMailcustomField54customField75customField82

我有一个屏幕,我必须在其中显示用户列表,并且有数千条记录(必须显示所有用户 - 毫无疑问)。

数据库 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 类中,并设法为每个用户填充已知值和自定义字段字典,而无需遍历整个集合.

我希望它被理解。这对我来说真的很难解释,也是一个很难找到解决方案的问题。

4

1 回答 1

2

您可以尝试将所有内容提取到字典中,然后您可以将特定的键/值映射到您的用户对象属性。

编辑:

我不再使用 VB.NET,但我会尝试解释一下。

创建与此类似的索引器: http ://www.java2s.com/Tutorial/VB/0120__Class-Module/DefineIndexerforyourownclass.htm

在索引器中,您将执行以下操作:

if (index == "FirsName") then
  me.FirstName = value
end if

....

if (index.startWith("customField") then
  var indexValue = int.Parse(index.Replace("customField",""))
  me.customFieldsDictionary[indexValue]  = value
end if

NPoco 支持将数据物化为字典:

var users = db.Fetch<Dictionary<string, object>>("select * from users");

您应该能够将您的类传递给 NPoco 并强制它使用 Fetch 重载作为字典。

我以前使用过这种方法,但目前找不到来源。

于 2015-09-30T10:59:27.553 回答