VB.NET - PetaPoco \ NPoco - 从包含动态和静态列的表中获取数据 - 性能问题

时间:2015-09-23 11:45:06

标签: sql-server vb.net petapoco micro-orm npoco

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

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

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

数据库A中的Users表列如下所示:

customField82

,举个例子,假设我有另一个数据库B,那里的用户表看起来像这样:

| UserID | UserName | UserMail | customField54 | customField55 |

我有一个代码,每次连接到另一个数据库。所以我有一个代码 - >多个数据库,而每个数据库的差异是| UserID | UserName | UserMail | customField109 | customField211 | customField235 | customField302 | 表的自定义字段。

如果我使用DataTable,我可以查询:

Users

然后,我可以动态地检索自定义字段值,如下所示:

    SELECT * FROM Users

我的意图是不使用DataTables。我想使用强类型对象。我不能像在里面那样使用customFields创建用户的POCO,因为对于每个数据库,Users表具有不同的customFields列,因此我无法创建具有强类型变量的对象。

然后,我决定创建一个内部已知列的用户类,以及一个包含customFields的字典。

在VB.NET中,我创建了一个类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

该类具有静态值: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及其值的字典,所以我可以在一个动作中检索值(在O(1)复杂度中)

我使用MicroORM PetaPoco \ NPoco来填充值。 ORM允许我获取用户数据,而无需我自己迭代数据,通过调用:

customFieldIDs

但是后来没有填充Dim userList As List(Of User) = db.Fetch(Of User)("SELECT * FROM Users") 字典。 为了填充,我必须迭代customFields,并为每个用户检索userList数据。 这是一种非常昂贵的获取数据的方法,并导致非常糟糕的性能。

我想知道是否有办法使用PetaPoco \ NPoco通过单个命令将数据提取到User类中,并设法为每个用户填充已知值和自定义字段字典,而无需迭代整个集合。

我希望它被理解。我很难解释并找到解决问题的难题。

1 个答案:

答案 0 :(得分:0)

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

编辑:

我不再使用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重载。

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