簡単な質問は次のとおりです。EF4でピボットテーブルを処理するにはどうすればよいですか。「ピボットクライアント側」以外の提案は役立つと見なされます。
1つのアイデアは、データベースに直接クエリを実行し、結果をデータセットに入れることです。それは非常に紳士的な解決策ではありません。私の他の唯一のアイデアは、ある種の反射魔法を使用して、一時オブジェクトのプロパティを動的に作成することです。ビューでそれを処理する方法がわかりません。
これがより長い説明であり、何でもありません:
私のアプリケーションにはいくつかの機器があります。これにより、ユーザーは機器の一部を「要求」してから、その機器のステータスを設定できます。
関連するテーブル構造は次のようになります。
EquipmentId, EquipmentName, etc
ClaimId, StatusChangeId, EquipmentId, UserId
StatusChangeId, StatusId, etc
StatusId, StatusName, etc
私のクエリは、ユーザーに関連するすべてのクレーム(削除、アーカイブ、または新規ではなく、ステータスが設定されているもののみ)を検索し、それぞれの最新のステータスを取得して集計し、それぞれの機器に関連付けます。
この大きなお尻の動的クエリは、データをピボットして次のような結果セットを作成します。
equipment name Total Status1 Status2 Status 3
Computer 4 0 3 1
Monitor 6 1 5 0
問題は...EF4でそれをどのように処理するのですか?ステータスは動的であり、列として返されるため、明確な解決策はありません。つまり、オブジェクトはその場で魔法のようにプロパティを作成する必要があります。今後数週間でステータスが変更される可能性は低いため、暫定的な解決策として、ステータスがハードコードされたオブジェクトを強制的にフィードしました。しかし、それはひどく醜く、私の動的列の目的、そしてまあ、ステータステーブル全体をやや打ち負かします。
私の他の唯一のアイデアは、1000以上のレコードに対して実行するのに1秒もかからない美しい新しいクエリを、一度に1つの機器のステータスとカウントを取得し、すべてをまとめる小さなクエリに分割することです。コードで。
数百種類の機器を使用しているユーザーにとって、これはデータベースへの数百回の移動を意味します。そして、これに基づいて、ベースユーザーに関連付けられているユーザーの機器情報を取得する他の2つのクエリがあります...したがって、数百種類の機器を持つユーザーがいて、彼が2つに関連付けられている場合それぞれ70種類の機器を持ち、ユーザーが関連付けられている他のユーザー...あなたは写真を手に入れます。
編集
これは、EquipmentStatusオブジェクトの一部としてStatusNameとCountを使用して、単純なオブジェクトのリストに列を配置することで解決できる可能性があると思います。悲しいことに、私はまだマッピングを行う方法がわかりません。 マイクロソフトはピボットの処理が問題であることを認めていますが、彼らの公式の言葉は「いつ起こるかわかりません」です。
編集2
時間があるとすぐに、最終的な解決策を投稿します。いよいよ今週生産になりますので、数日かかるかもしれません。答えを探しにここに来る人は誰でも申し訳ありません。