使用Database.SqlQuery()的entity framework,其中列名是无效的C#成员名称

  • entity framework6.1

我有一个存储过程,返回以下结果:

在此处输入图像描述

所以这些字段名称自然不是我修改为POCO的有效标识符:

public class AdHoc_UspGetPassengerCountByAgeReturnDto { public Int32? _0_18 { get; set; } public Int32? _19_30 { get; set; } public Int32? _31_40 { get; set; } public Int32? _41_50 { get; set; } public Int32? _51_60 { get; set; } public Int32? _61_70 { get; set; } public Int32? _71_80 { get; set; } public Int32? _81plus { get; set; } } 

由于属性名称更改以下内容:

 public List AdHoc_UspGetPassengerCountByAge(out int aProcResult) { SqlParameter procResultParam = new SqlParameter {ParameterName = "@procResult", SqlDbType = SqlDbType.Int, Direction = ParameterDirection.Output}; List procResultData = Database.SqlQuery("EXEC @procResult = [AdHoc].[usp_GetPassengerCountByAge] ", procResultParam).ToList(); aProcResult = (int) procResultParam.Value; return procResultData; } 

返回null值,因为名称不匹配。

所以我想要解决的是我如何执行SP调用但返回一些generics类型,以便我可以在返回到我的Adhoc_UspGetPassengerCountByAgeReturnDto之间进行转换。

有人能指出我正确的方向吗?

不幸的是,列的映射是不可能的。 这已被要求多年,并且最终获得支持,最终使其成为codeplex上的“Proposed”状态,但它还没有使用SqlQuery。

链接: http : //entityframework.codeplex.com/workitem/233?PendingVoteId=233

通过解决方案进行更新

如果您可以修改存储过程,那么这是使字段匹配的最佳方法。 如果那是不可能的,那么你可以创建一个表变量,它包含你想要的输出列以匹配你的poco,然后INSERT/EXEC进入表变量,最后是表SELECT *变量中的SELECT * 。 然后您的SQL命令变为:

 DECLARE @Data TABLE ( _0_18 INT, _19_30 INT, _31_40 INT, _41_50 INT, _51_60 INT, _61_70 INT, _71_80 INT, _81plus INT ) INSERT @Data EXEC @procResult = [AdHoc].[usp_GetPassengerCountByAge] SELECT * FROM @Data