使用Entity Framework或Enterprise Library创建自定义报告?

时间:2011-10-17 15:36:34

标签: asp.net-mvc-3 entity-framework-4 enterprise-library

我使用ASP.Net MVC 3和Entity Framework 4为客户开发了一个系统。该系统是一个小型应用程序,它允许客户端记录和监控他的设备,即他可以添加一个设备,如PC(记录资产编号,价格,Warrenty Expires等),将其分配到类别(即PC系统,打印机,扬声器等),并记录设备的位置(即主办公室,储藏室,第二大楼)。这一切都很好,但是,最近客户要求将一些报告内置到系统中。

有些报告很简单,即按设备资产编号搜索,然后返回与之相关的所有其他信息。但是,他需要一个报告,这是列出报告顶部的所有位置,然后列出报告左侧的所有类别,就像网格/查找表一样。然后,这将显示每个位置的设备类别总数,例如,第二大楼的PC系统总数,储藏室中的扬声器总数等。

我在想,虽然我可能错了,但这不是Entity Framework的设计目标,即返回对象,而不是显示计算的数据集。因此,我想知道,最好的方法是什么?

我在考虑使用Microsoft Enterprise Library和Stored Procedures来返回结果数据集,但是,这可能是错误的方法吗?

同样,任何反馈都会非常感激,如果我的请求有点令人困惑,我会道歉。

感谢。

2 个答案:

答案 0 :(得分:1)

由于您将其标记为MVC 3 - 您是否正在寻找一个Web界面供他们选择一个类别,结果会显示出来?如果是这样,你肯定可以使用Entity Framework。只需对控制器的方法使用Ajax请求,然后返回包含该数据的视图。

无需任何程序 - 您可以在实体框架中完成所有操作。您的左侧是实体A.当您单击一个时,它会对/ Category / Index / 5执行ajax请求,例如,它们只是呈现这些结果。

答案 1 :(得分: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; }
}

然后构建此表只不过是迭代m: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;
}

我不知道数据契约序列化程序是否能够序列化多维数组,否则你必须使用锯齿状数组。您当然应该将其打包到一个对象中,并且还包括标题信息(按值排序时字典中的键),以便您知道哪个索引意味着什么。