2011-10-17 26 views
0

我爲使用ASP.Net MVC 3和Entity Framework 4的客戶開發了一個系統。該系統是一個小型應用程序,它允許客戶端記錄和監控他的設備,也就是說他可以添加一臺設備,如PC (記錄資產編號,價格,Warrenty Expires等),將其分配到一個類別(即PC系統,打印機,揚聲器等),並記錄設備的位置(即總部,儲藏室,第二座)。這一切都很好,但是,最近客戶已經要求將一些報告內置到系統中。使用實體框架或企業庫創建自定義報告?

有些報告很簡單,即按設備資產編號進行搜索,然後返回所有與此相關的附加信息。但是,他需要一個報告,這是列出報告頂部的所有位置,然後列出報告左側的所有類別,就像網格/查找表一樣。然後這將顯示每個位置的設備類別總數,例如,二樓的PC系統總數,商店房間中的揚聲器總數等。

我在想,雖然我可能是錯的,這不是實體框架的設計目的,即返回對象,而不是顯示計算的數據集。因此,我想知道,最好的辦法是什麼?

我在考慮可能使用Microsoft企業庫和存儲過程來返回結果數據集,但是,也許這是錯誤的方法?

再次,任何反饋將不勝感激,我很抱歉,如果我的請求有點混亂。

謝謝。

回答

1

您的客戶希望您展示的產品稱爲數據透視表。看看這裏的答案:Pivot table in c# entity framework

但如果你有以下實體

public class Location { 
    public int LocationId { get; set; } // PK 
} 
public class Equipment { 
    public int EquipmentId { get; set; } // PK 
} 
public class EquipmentAtLocation { 
    public int LocationId { get; set; } // PK/FK 
    public int EquipmentId { get; set; } // PK/FK 
    public int Quantity { get; set; } 
} 

那麼建立這個表無非是遍歷你的米還有:N表EquipmentAtLocation和寫作Quantity到由LocationId和EquipmentId給出的細胞。如果您在該表格上沒有該PK,那麼您需要首先按照該表上的LocationId和EquipmentId進行分組。

var locations = ctx.Locations.Select((val, idx) => new { val.LocationId, idx }).ToDictionary(x => x.LocationId, y => y.idx); // get a map of location to index 
var equipments = ctx.Equipments.Select((val, idx) => new { val.EquipmentId, idx }).ToDictionary(x => x.EquipmentId, y => y.idx); // get a map of equipment to index 

int[,] pivot = new int[locations.Count, equipments.Count]; 
foreach (var entry in ctx.EquipmentAtLocations) { 
    pivot[locations[entry.LocationId], equipments[entry.EquipmentId]] += entry.Quantity; 
} 

我不知道如果數據合同串行器能夠序列化多維數組,否則,您必須使用交錯數組。你當然應該將它打包到一個對象中,並且還要包含標題信息(按值排序時字典中的鍵),以便知道哪個索引意味着什麼。

+0

大唐。謝謝。 – tgriffiths

1

由於您將此標記爲MVC 3 - 您是否在尋找一個Web界面以供他們選擇一個類別,並顯示結果?如果是這樣,當然你可以使用實體框架。只需對控制器的方法使用Ajax請求,然後將視圖與其中的數據一起返回。

無需任何程序 - 您可以在實體框架中完成所有操作。你的左邊是Entity A.當你點擊一個時,它會對/ Category/Index/5做一個ajax請求,例如它們只是呈現這些結果。

+0

謝謝你這個亞當。 – tgriffiths