2

简短的问题是:如何在 EF4 中处理数据透视表?除了“pivot client-side”之外的任何建议都将被认为是有帮助的。

一种想法是直接查询数据库并将结果放入数据集中。这不是一个非常绅士的解决方案。我唯一的另一个想法是使用某种反射魔法来为临时对象动态创建属性。我不知道如何在视图中处理它。

这是更长的解释等等:

我的应用程序有一些设备。它允许用户“认领”一件设备,然后为该设备设置一个状态。

相关的表结构如下所示:

    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 对象的一部分。可悲的是,我仍然不知道如何进行映射。 尽管微软承认处理枢轴是一个问题,但他们的官方说法是“我们不知道它什么时候会发生”。

编辑 2

只要我有时间,我会发布我的最终解决方案。我们这周终于要生产了,所以可能要几天。对不起任何来这里寻找答案的人。

4

1 回答 1

0

EF 无法处理此类动态查询 - EF 是强类型的,因此您至少需要一个类型(类),其属性与结果集中的列同名。此类型可用于从结果集中具体化记录。

那么如何将这种方法与动态结果集一起使用呢?它需要首先查询数据库以获取实际查询中使用的列的名称,用于Reflection.Emit创建具有动态类型的动态程序集(每个查询具有不同结果集的新程序集)并以某种动态方式使用它(可能通过反射)。

一种想法是直接查询数据库并将结果放入数据集中。这不是一个非常绅士的解决方案。

DataSetDataAdapter并且DbCommand是具有动态结果集的查询的类。这些类比在运行时创建程序集的解决方案差多少?DataSet 将允许您在几分钟内实现这一点!

于 2012-07-09T08:58:13.237 回答