我有一个共同的apper函数来获得list<model>
使用dapper
的QueryAsync
函数如下图
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;
});
}
现在我从我的业务逻辑层调用这个方法,如下所示
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.List
1[System.Object]' to type 'System.Collections.Generic.List
1[docprod . dms . businessentities . admin . gettemplates] .
我不知道上面的代码有什么问题
Dapper在这里创建列表。如果您希望它是GetTemplates
的列表,那么您将不得不告诉dapper这一点,大概是通过使方法泛型并调用_Dapper.QueryAsync<GetTemplates>(...)
。也就是说……老实说,这个方法除了连接设置和日志记录之外并没有添加任何东西——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
});
}