我有一个存储过程,它返回以下结果:
很自然,这些字段名称不是我修改为的结果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_UspGetPassengerCountByAgeReturnDto> AdHoc_UspGetPassengerCountByAge(out int aProcResult)
{
SqlParameter procResultParam = new SqlParameter {ParameterName = "@procResult", SqlDbType = SqlDbType.Int, Direction = ParameterDirection.Output};
List<AdHoc_UspGetPassengerCountByAgeReturnDto> procResultData =
Database.SqlQuery<AdHoc_UspGetPassengerCountByAgeReturnDto>("EXEC @procResult = [AdHoc].[usp_GetPassengerCountByAge] ", procResultParam).ToList();
aProcResult = (int) procResultParam.Value;
return procResultData;
}
返回空值,因为名称不匹配。
所以我想解决的是我如何执行SP调用但返回一些泛型类型,以便我可以在返回到我的Adhoc_UspGetPassengerCountByAgeReturnDto之间进行转换。
有人能指出我正确的方向吗?
答案 0 :(得分:5)
不幸的是,列的映射是不可能的。这已经被要求多年了,并且最终获得支持,最终使它成为codeplex上的“Proposed”状态,但它还没有使用SqlQuery。
链接:http://entityframework.codeplex.com/workitem/233?PendingVoteId=233
使用解决方法进行更新
如果您可以修改存储过程,那么这是使字段匹配的最佳方法。如果那是不可能的,那么您可以创建一个表变量,其中包含您想要的输出列以匹配您的poco,然后INSERT/EXEC
到表变量,最后来自表变量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