首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用Dapper.Net ORM将存储过程输出转换为具体类型?

如何使用Dapper.Net ORM将存储过程输出转换为具体类型?
EN

Stack Overflow用户
提问于 2012-04-13 21:20:26
回答 2查看 2.4K关注 0票数 2

使用实体框架,我可以从我正在处理的项目的数据库中的大多数链式图中创建具体的类。但是,有些sproc使用动态SQL,因此不为sproc返回元数据。

因此,对于那个sproc,我手动创建了一个具体的类,现在我希望将sproc输出映射到这个类并返回这个类型的列表。

使用以下方法,我可以获得对象的集合:

代码语言:javascript
运行
复制
                var results = connection.Query<object>("get_buddies", 
                    new {   RecsPerPage = 100,
                            RecCount = 0,
                            PageNumber = 0,
                            OrderBy = "LastestLogin",
                            ProfileID = profileID,
                            ASC = 1}, 
                        commandType: CommandType.StoredProcedure);

我的具体课程包含

代码语言:javascript
运行
复制
[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:指定的强制转换无效。在反序列化.

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-06 14:07:19

解决这一问题的方法是使用EF创建从sproc派生的复杂对象:

代码语言:javascript
运行
复制
    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

票数 0
EN

Stack Overflow用户

发布于 2012-06-05 21:23:19

据猜测,您的SQL列是bigint (即Int64 a.k.a )。long),但是您的.Net类型具有n Int16属性。

您可以使用转换,并通过执行以下操作来忽略存储过程:

代码语言:javascript
运行
复制
var results = connection.Query<LoggedInMember>("select cast(9 as smallint) [RowID] ...");

其中您只是选择要返回对象的属性和类型。(smallint是与Int16等价的SQL )

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10148459

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档