【问题标题】:cast system.object to List<model> asp.net mvc将 system.object 转换为 List<model> asp.net mvc
【发布时间】:2023-01-20 18:10:55
【问题描述】:

我有一个通用的 dapper 函数,使用 dapperQueryAsync 获取 list&lt;model&gt;

该功能如下所示

public async Task<object> QueryAsync(string spName, DynamicParameters p)
{
    return await Task.Run(async () =>
    {
        object obj = new object();
        IList objectList = obj as IList;
        using (SqlConnection conn = new SqlConnection(_connStr))
        {
            try
            {
                conn.Open();
                obj = (List<object>)await conn.QueryAsync<object>(sql: spName, param: p, commandType: CommandType.StoredProcedure);
            }
            catch (Exception ex)
            {
                Utils.Logger.Instance.LogException(ex);
            }
            conn.Close();
        }
        return obj;
    });
}

现在我从我的 businessLogic 层调用这个方法,如下所示

public async Task<List<GetTemplates>> GetDocTemplates(string TemplateName, int AccountId)
{
    _Parameters.Add("@SP_TemplateName", TemplateName, dbType: DbType.String, direction: ParameterDirection.Input);
    _Parameters.Add("@SP_AccountId", AccountId, dbType: DbType.Int32, direction: ParameterDirection.Input);
    return (List<GetTemplates>)await _Dapper.QueryAsync("[dbo].[GetDocTemplates]", _Parameters);
}

但我收到以下错误。

无法转换类型的对象 'System.Collections.Generic.List1[System.Object]' to type 'System.Collections.Generic.List1[DocPro.DMS.BusinessEntities.Admin.GetTemplates]'。

我不知道上面的代码有什么问题。

【问题讨论】:

标签: c# asp.net-mvc object model dapper


【解决方案1】:

Dapper 在此处创建列表。如果您希望它成为GetTemplates 的列表,那么您将不得不告诉 dapper 这件事,可能是通过使方法通用并调用 _Dapper.QueryAsync&lt;GetTemplates&gt;(...)。就是说......老实说,除了连接设置和日志记录之外,这种方法并没有真正添加任何东西 - Task.Run 是不必要的,盲目的 catch 吞下失败是积极危险的,而 DynamicParameters 是最不受欢迎的方式将参数传递给 dapper。建议:

public async Task<List<T>> QueryListAsync<T>(string spName, object parameters)
{
    using var conn = new SqlConnection(_connStr);
    try
    {
        return (await conn.QueryAsync<T>(sql: spName, param: parameters, commandType: CommandType.StoredProcedure)).AsList();
    }
    catch (Exception ex)
    {
        Utils.Logger.Instance.LogException(ex);
        throw;
    }
}
...
public Task<List<GetTemplates>> GetDocTemplates(string TemplateName, int AccountId)
{
    return _Dapper.QueryListAsync<GetTemplates>("[dbo].[GetDocTemplates]", new {
        SP_TemplateName = TemplateName,
        SP_AccountId = AccountId
    });
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-12
    • 2016-08-16
    • 2023-02-02
    • 2011-07-06
    • 2021-07-04
    相关资源
    最近更新 更多