首先我应该注意到我是 ASP.NET 的新手(不过,我对 C# 有一些经验)和实体框架。我在一个学校项目上工作,有一个相当复杂的数据库,其中包含能源消耗数据。我需要的那些(I
导入、E
导出、无功功率C
和L
)以二进制压缩的形式存储在一个列中,因此为了将它们取出,我必须使用一个存储过程,该过程调用自定义程序集中的一些方法来解压缩列并恢复数据。
存储过程有 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
但将未使用的列留空,这是我的项目负责人可能不会解决的解决方案。喜欢。谢谢你的帮助。