1

まだ解決策を見つけていない特定の状況があります。

、、Usersなどの既知の列を持つテーブルがある同じ構造のデータベースがいくつかあります (たとえば) 。同じテーブルには、実行時にのみ知ることができる動的なカスタム列があります。など: 、、など...UserIDUserNameUserMailcustomField54customField75customField82

ユーザーのリストを表示する必要がある画面があり、何千ものレコードがあります (すべてのユーザーを表示する必要があります - 疑問の余地はありません)。

データベース 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 クラスにフェッチし、コレクション全体を反復処理することなく、すべてのユーザーの既知の値とカスタム フィールド ディクショナリを設定する方法があるかどうかを知りたいです。 .

ご理解いただければ幸いです。説明するのは本当に難しく、解決策を見つけるのは非常に難しい問題です。

4

1 に答える 1

2

すべてを辞書にフェッチしてから、特定のキー/値を 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 オーバーロードを使用するように強制できるはずです。

以前にこのアプローチを使用したことがありますが、現時点ではソースが見つかりません。

于 2015-09-30T10:59:27.553 に答える