0

首先我应该注意到我是 ASP.NET 的新手(不过,我对 C# 有一些经验)和实体框架。我在一个学校项目上工作,有一个相当复杂的数据库,其中包含能源消耗数据。我需要的那些(I导入、E导出、无功功率CL)以二进制压缩的形式存储在一个列中,因此为了将它们取出,我必须使用一个存储过程,该过程调用自定义程序集中的一些方法来解压缩列并恢复数据。

存储过程有 4 个参数:

@identify int,
@startTime datetime,
@endTime datetime,
@args nvarchar(60) -- "Selector"

比较selector特殊,它是一个参数,您可以在其中指定结果集中所需的内容,例如'i'仅针对 Import 列,'i,e'针对 Import 和 Export。他们这样设计它是因为如果您只需要一列而不是所有列(因为压缩数据的存储方式),它会更快。

因此,我创建了一个名为 的 ADO.NET 实体模型EnergyConsumptionDBModel,导入了存储过程并EnergyConsumptionResult为存储过程返回类型创建了复杂类型,如下所示:

public partial class EnergyConsumptionResult
{
    public System.DateTime Time { get; set; }
    public double I { get; set; }
    public double E { get; set; }
    public double L { get; set; }
    public double C { get; set; }
}

该列Time始终存在于结果集中,但其余部分取决于@args存储过程的参数。例如,如果我选择'i,e,c,l'作为参数,它将返回列Time, I, E, C, L,一切都很好,但是如果我选择例如'i'它返回Time, I,这给了我一个例外:

数据读取器与指定的“EnergyConsumptionDBModel.EnergyConsumptionResult”不兼容。
类型的成员“E”在数据读取器中没有同名的对应列。

所以问题是,有没有一些简单的方法可以解决这个问题?某种复杂类型的动态结果映射,或者告诉我的同事谁设计了存储过程以使其返回所有列,@args但将未使用的列留空,这是我的项目负责人可能不会解决的解决方案。喜欢。谢谢你的帮助。

4

1 回答 1

2

我认为不可能在 EF 中自动映射具有可变列数的结果集。您在设计时指定映射,EF 依赖于此。您可以做的是返回所有列,但将不返回数据的列设置为空。您可以尝试使用直接执行存储过程并在 ObjectContext (http://msdn.microsoft.com/en-us/library/dd466384.aspx) 上使用 Translate 方法进行具体化,但我认为这种方法也将在您的读者中使用列对应于属性名称。

于 2012-10-22T20:26:11.193 回答