ASP.NET Core 3.1中Dapper返回类型转换编译错误求助
解决Dapper QueryAsync返回值与接口Task<IReadOnlyList>的类型兼容问题
出现编译错误的核心原因是:Task<IEnumerable<T>>和Task<IReadOnlyList<T>>是不同的泛型Task实例,即使IReadOnlyList<T>继承自IEnumerable<T>,Task的泛型参数不支持隐式协变转换,因此无法直接赋值。
你可以通过以下方式修复:
显式转换查询结果为IReadOnlyList
实现类
在await Dapper的QueryAsync获取到IEnumerable结果后,将其转换为实现了IReadOnlyList 的具体类型(比如List 或ReadOnlyCollection ),再返回即可。 示例代码:
public async Task<IReadOnlyList<T>> QueryReadOnlyListAsync<T>(string sql, object parameters = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null) { // 先await获取异步结果 var queryResult = await _connection.QueryAsync<T>(sql, parameters, transaction, commandTimeout, commandType); // 转换为List<T>(它实现了IReadOnlyList<T>) return queryResult.ToList(); // 或者返回只读集合:return new List<T>(queryResult).AsReadOnly(); }两种转换方式的区别:
ToList()返回的List<T>是可修改的,但因为接口定义的是IReadOnlyList<T>,外部调用者无法通过接口修改集合;AsReadOnly()返回的ReadOnlyCollection<T>是真正的只读集合,内部也无法修改,适合需要严格只读场景。
内容的提问来源于stack exchange,提问作者santosh kumar patro
相关产品推荐
相关产品推荐

