使用实体框架,我可以从我正在处理的项目的数据库中的大多数链式图中创建具体的类。但是,有些sproc使用动态SQL,因此不为sproc返回元数据。
因此,对于那个sproc,我手动创建了一个具体的类,现在我希望将sproc输出映射到这个类并返回这个类型的列表。
使用以下方法,我可以获得对象的集合:
var results = connection.Query<object>("get_buddies",
new { RecsPerPage = 100,
RecCount = 0,
PageNumber = 0,
OrderBy = "LastestLogin",
ProfileID = profileID,
ASC = 1},
commandType: CommandType.StoredProcedure);
我的具体课程包含
[DataContractAttribute(IsReference=true)]
[Serializable()]
public partial class LoggedInMember : ComplexObject
{
/// <summary>
/// No Metadata Documentation available.
/// </summary>
[EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
[DataMemberAttribute()]
public global::System.Int16 RowID
{
get
{
return _RowID;
}
set
{
OnRowIDChanging(value);
ReportPropertyChanging("RowID");
_RowID = StructuralObject.SetValidValue(value);
ReportPropertyChanged("RowID");
OnRowIDChanged();
}
}
private global::System.Int16 _RowID;
partial void OnRowIDChanging(global::System.Int16 value);
partial void OnRowIDChanged();
[EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
[DataMemberAttribute()]
public global::System.String NickName
{
get
{
return _NickName;
}
set
{
OnNickNameChanging(value);
ReportPropertyChanging("NickName");
_NickName = StructuralObject.SetValidValue(value, false);
ReportPropertyChanged("NickName");
OnNickNameChanged();
}
}
private global::System.String _NickName;
partial void OnNickNameChanging(global::System.String value);
partial void OnNickNameChanged();
.
.
.
无需迭代结果并将输出参数添加到LoggedInMember对象中,如何动态映射这些参数,以便通过WCF服务返回它们的列表?
如果我尝试var results = connection.Query<LoggedInMember>("sq_mobile_get_buddies_v35", ...
,我会得到以下错误:
System.Data.DataException:错误解析列0 (RowID=1 - Int64) -> System.InvalidCastException:指定的强制转换无效。在反序列化.
发布于 2012-06-06 14:07:19
解决这一问题的方法是使用EF创建从sproc派生的复杂对象:
public ProfileDetailsByID_Result GetAllProfileDetailsByID(int profileID)
{
using (IDbConnection connection = OpenConnection("PrimaryDBConnectionString"))
{
try
{
var profile = connection.Query<ProfileDetailsByID_Result>("sproc_profile_get_by_id",
new { profileid = profileID },
commandType: CommandType.StoredProcedure).FirstOrDefault();
return profile;
}
catch (Exception ex)
{
ErrorLogging.Instance.Fatal(ex); // use singleton for logging
return null;
}
}
}
在本例中,ProfileDetailsByID_Result是我通过Complex创建过程使用实体框架手动创建的对象(右键单击模型图,选择Add/Complex .或在RHS上使用复杂类型树)。
--警告词
由于该对象的属性是从sproc派生的,因此EF无法知道属性是否为空。对于任何可空属性类型,必须手动配置这些,方法是选择该属性并将其nullable属性设置为true
。
发布于 2012-06-05 21:23:19
据猜测,您的SQL列是bigint
(即Int64
a.k.a )。long
),但是您的.Net类型具有n Int16属性。
您可以使用转换,并通过执行以下操作来忽略存储过程:
var results = connection.Query<LoggedInMember>("select cast(9 as smallint) [RowID] ...");
其中您只是选择要返回对象的属性和类型。(smallint
是与Int16
等价的SQL )
https://stackoverflow.com/questions/10148459
复制相似问题