2

簡単な質問は次のとおりです。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

時間があるとすぐに、最終的な解決策を投稿します。いよいよ今週生産になりますので、数日かかるかもしれません。答えを探しにここに来る人は誰でも申し訳ありません。

4

1 に答える 1

0

EFはそのような動的クエリを処理できません-EFは強く型付けされているため、少なくとも結果セットの列と同じ名前のプロパティを持つ型(クラス)が必要です。このタイプは、結果セットからレコードを実体化するために使用できます。

では、動的な結果セットでこのアプローチをどのように使用するのでしょうか。実際のクエリで使用される列の名前を取得するために最初にデータベースにクエリを実行し、Reflection.Emit動的タイプ(結果セットが異なるクエリごとに新しいアセンブリ)を使用して動的アセンブリを作成し、それを動的な方法で使用するようなものが必要になります(おそらく反射による)。

1つのアイデアは、データベースに直接クエリを実行し、結果をデータセットに入れることです。それは非常に紳士的な解決策ではありません。

DataSetDataAdapterおよびDbCommandは、動的な結果セットを持つクエリのクラスです。これらのクラスは、実行時にアセンブリを作成するソリューションよりもどのように悪いですか?DataSetを使用すると、これを数分で実装できます。

于 2012-07-09T08:58:13.237 に答える