2011-10-17 88 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