2017-07-10 6 views
1

私は基本的に、このデータセットがあります。 C#ASP.NetでデータをピボットするためにEntity FrameworkまたはGridViewを使用しますか?

+-----------+-----------+---------+---------+ 
| Name | Machine | Status | Version | 
+-----------+-----------+---------+---------+ 
| Service 1 | Machine 1 | Running | 2.2.2 | 
| Service 1 | Machine 2 | Running | 2.2.2 | 
| Service 1 | Machine 3 | Running | 2.2.2 | 
| Service 2 | Machine 1 | Running | 2.2.2 | 
| Service 2 | Machine 2 | Running | 2.2.2 | 
| Service 2 | Machine 3 | Running | 2.2.2 | 
| Service 3 | Machine 1 | Running | 2.2.2 | 
| Service 3 | Machine 2 | Running | 2.2.2 | 
| Service 3 | Machine 3 | Running | 2.2.2 | 
+-----------+-----------+---------+---------+ 

私は今、このようなテーブルを取得するには、「ピボット」に名前欄を希望:

私は、このテーブルを与える

MyDbContext db = new MyDbContext(); 
GridView gridView = new GridView(); 
gridView.DataSource = db.Services; 
gridView.DataBind(); 

+-----------+-----------+-----------+-----------+ 
| Machine | Service 1 | Service 2 | Service 3 | 
+-----------+-----------+-----------+-----------+ 
| Machine 1 | Running | Running | Running | 
| Machine 2 | Running | Running | Running | 
| Machine 3 | Running | Running | Running | 
+-----------+-----------+-----------+-----------+ 

これを行うには、Entity FrameworkまたはGridViewに優れたツールがあるかどうかが疑問です。私はgoogleで解決策を見つけようとしていますが、私自身のピボット機能を作成するのには至っていませんが、私は有用な解決策を見つけていません。

編集2:

お知らせ:これは私の実際の環境のスリム化バージョンです。私は3台以上のマシンを監視し、さらに多くのマシンを動的に追加する機能を持っています。私は現時点で3つのサービスしか持っていませんが、これはおそらく後でService 4Service 5で既存のマシンまたは新しいマシンに展開されます。だから私はピボットのための一般的な解決策が必要です。ありがとう!

編集1:

db.Database.ExecuteSqlCommand(
"CREATE VIEW pivotedServices AS (" + 
"SELECT " + 
    "Machine, [Service 1], [Service 2], [Service 3] " + 
"FROM " + 
    "(dbo.Services) " + 
"PIVOT" + 
"(Status FOR [Name] IN ([Service 1], [Service 2], [Service 3])) AS pvt);" 
); 

しかし、それが動作するように取得していない:

私はPIVOTを使用してビューを作成するために、エンティティフレームワークを使用しようとしました。 "near"( '。 "、いくつかのテストの後、問題のあるSELECTステートメントの前の最初のかっこのように見えます)。周囲のかっこを削除すると、" near SELECT "エラーが発生します。 。

私はまた、手動で「ピボット」するためのいくつかのfor-loopsを使ってみましたが、かなりうまく動いています。しかし、もっと良い解決策が必要だと感じています。しかし、私はあなたたちは1を持って望んでいる

+0

この問題のSQLクエリを設計し、あなたが 'Gridview'で試したことを示す必要があります。 – AsifAli72090

+0

GridViewで何も試したことがありません。なぜなら、私はそれに有用なツールが見つからないからです。私が試したことは、バインドする前にいくつかのfor-loopsでデータを手動でループすることです。しかし、そこには「良い方法」がなければならないような気がする。私はまだそれを見つけていない。 – Skillzore

+0

問題のデータベースクエリを追加しました。 – AsifAli72090

答えて

2

ソリューションです:。

まず、3つのテーブル(「サービス」、「マシン」、「Service_Machine」)にあなたのテーブルを正規化:

CREATE TABLE Services 
(
    ServiceId INTEGER PRIMARY KEY NOT NULL, 
    Name VARCHAR (25), 
    Status VARCHAR (25), 
    Version VARCHAR (25) 
); 

CREATE TABLE Machines 
(
    MachineId INTEGER PRIMARY KEY NOT NULL, 
    Name VARCHAR (25) 
); 

// this table is created as above two tables have Many-to-Many Relationship 

CREATE TABLE Service_Machine 
(
    ServiceId INTEGER REFERENCES Services (ServiceId), 
    MachineId INTEGER REFERENCES Machines (MachineId) 
); 

そして2つのビュー( 'SimpleView'、 'PivotView')を作成:あなたはGridViewのと結合することができます

CREATE VIEW SimpleView AS 
SELECT s.ServiceId, s.Name AS 'Name',m.MachineId, m.Name AS 'Machine',s.Status,s.Version 
FROM Services AS s,Machines AS m,Service_Machine AS sm 
WHERE s.ServiceId=sm.ServiceId 
AND m.MachineId=sm.MachineId 

SimpleView出力:

enter image description here

拡張:

もう1つのビューを作成ViewStatus

select distinct(sv.ServiceId) as 'ServiceId', sv.Name, sv.Status 
from SimpleView sv 
inner join SimpleView sv2 on sv.MachineId = sv2.MachineId 
inner join SimpleView sv3 on sv.ServiceId = sv2.ServiceId 

そして今、あなたは、PivotViewビューを作成する必要があります。CSコード

​​

PivotView出力あなたはGridViewのと結合することができます。 enter image description here

注: SQLiteのメーカーは、データベースクエリの上に設計するために使用されています。

+0

非常に明確で徹底的な答え、ありがとう!しかし、これは私の主張ではないので、3つ以上のマシンがあり、マシンを動的に追加する機能もあります。現時点では、私は3つのサービスしか監視しませんが、それは拡大する可能性があります。将来、同じマシンや他のマシンに「サービス4」と「サービス5」が存在する可能性があります。だから、基本的には、私は、現在のように、少なくとも機械のために、より一般的に、しかし好ましくはサービスのために、 'PivotView'の作成を必要とします。あなたがそれを管理するなら、これは私の実際の(しかし隠された)質問に対する完璧な答えになります。編集します。 – Skillzore

+0

@Skillzore私は私の答えを編集しました。今度は、必要に応じてサービス列を動的に作成します。 **拡張部品** – AsifAli72090

+0

素晴らしいを参照してください!ありがとうございました! :) – Skillzore

関連する問題