首先,我应该注意到我是ASP.NET的新手(但是,我有一些C#的经验)和实体框架。我在一个学校项目上工作,有一个包含能耗数据的相当复杂的数据库。我需要的那些(I
导入,E
导出,无功功率C
和L
)作为二进制压缩存储在一列中,以便将它们取出我必须使用存储过程,它调用自定义程序集中的某些方法来解压缩列并恢复数据。
存储过程有4个参数:
@identify int,
@startTime datetime,
@endTime datetime,
@args nvarchar(60) -- "Selector"
selector
相当特殊,它是一个参数,您可以在结果集中指定所需内容,例如'i'
仅适用于导入列,'i,e'
适用于导入和导出。他们设计它是这样的,因为如果你只需要一列而不是所有列(因为存储压缩数据的方式)它会更快。
因此,我创建了一个名为EnergyConsumptionDBModel
的ADO.NET实体模型,导入存储过程并为存储过程返回类型创建复杂类型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
中的所有列但是将未使用的列留空是一个解决方案要简单得多我的项目负责人可能不喜欢。谢谢你的帮助。
答案 0 :(得分:2)
我认为不可能在EF中自动映射具有可变列数的结果集。您在设计时指定映射,EF依赖于此。您可以做的是返回所有列,但将不返回数据的列设置为null。您可以尝试直接执行存储过程并在ObjectContext(http://msdn.microsoft.com/en-us/library/dd466384.aspx)上使用Translate方法进行实现,但我认为此方法也会在您的读者中使用列对应于属性名称。