简短的问题是:如何在EF4中处理数据透视表?除了“支持客户端”之外的任何建议都将被视为有用。
一个想法是直接查询数据库并将结果放入数据集中。这不是一个非常绅士的解决方案。我唯一的另一个想法是使用某种反射魔法来动态创建临时对象的属性。我不知道如何在视图中处理它。
这是更长的解释和诸如此类的东西:
我的应用程序有各种设备。它允许用户“声称”一件设备,然后为该设备设置状态。
相关的表格结构如下:
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多条记录运行到一个小小的记录中 获取状态和计数的小查询 设备一次在代码中汇总。
对于拥有几百种不同类型设备的用户,这意味着数百次访问数据库。我还有另外两个基于此问题的查询,它们为与基本用户关联的用户获取设备信息...所以如果有一个用户拥有几百种类型的设备,并且他与两个相关联其他用户每人拥有70种设备,并且他们有相关的用户...你得到了图片。
修改
我发现这可能通过将列放入具有StatusName和Count作为EquipmentStatus对象的一部分的简单对象的列表来解决。可悲的是,我仍然不知道如何进行映射。 Even though Microsoft acknowledges that handling pivots is an issue, their official word is "we don't know when it'll happen".
编辑2
我有空的时候会发布我的最终解决方案。我们终于在本周开始生产,所以可能需要几天时间。对不起来这里寻找答案的人。
答案 0 :(得分:0)
EF无法处理此类动态查询 - EF是强类型的,因此您至少需要一个类型(类)具有与结果集中的列同名的属性。此类型可用于从结果集中实现记录。
那么如何将这种方法与动态结果集一起使用?它需要首先查询数据库以获取真实查询中使用的列的名称,使用Reflection.Emit
创建具有动态类型的动态程序集(每个查询具有不同结果集的新程序集)并在其中使用它一些动态的方式(可能是通过反思)。
一个想法是直接查询数据库并将结果放入 数据集。这不是一个非常绅士的解决方案。
DataSet
,DataAdapter
和DbCommand
是具有动态结果集的查询的类。这些类比在运行时创建程序集的解决方案更糟糕? DataSet将允许您在几分钟内实现它!