まだ解決策を見つけていない特定の状況があります。
、、Users
などの既知の列を持つテーブルがある同じ構造のデータベースがいくつかあります (たとえば) 。同じテーブルには、実行時にのみ知ることができる動的なカスタム列があります。など: 、、など...UserID
UserName
UserMail
customField54
customField75
customField82
ユーザーのリストを表示する必要がある画面があり、何千ものレコードがあります (すべてのユーザーを表示する必要があります - 疑問の余地はありません)。
データベース A のユーザー テーブルの列は次のようになります。
| 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 で、次のようなクラス Users を作成しました。
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
ため、1 回のアクションで値を取得できます (O(1) の複雑さ)。
MicroORM PetaPoco\NPoco を使用して値を入力します。ORM を使用すると、次のように呼び出して、自分でデータを反復処理することなく、Users データを取得できます。
Dim userList As List(Of User) = db.Fetch(Of User)("SELECT * FROM Users")
しかし、customFields
辞書にはデータが取り込まれていません。userList
データを入力するには、ユーザーごとに繰り返してcustomFields
データを取得する必要があります。これは、データをフェッチするための非常にコストのかかる方法であり、パフォーマンスが非常に低下します。
単一のコマンドで PetaPoco\NPoco を使用してデータを User クラスにフェッチし、コレクション全体を反復処理することなく、すべてのユーザーの既知の値とカスタム フィールド ディクショナリを設定する方法があるかどうかを知りたいです。 .
ご理解いただければ幸いです。説明するのは本当に難しく、解決策を見つけるのは非常に難しい問題です。