[英]Conversion between IEnumerable to IList (Dapper return result)
有UserManager
方法的簽名(ASP .NET Identity Core默認實現):
public Task<IList<string>> GetRolesAsync(User user) {
const string query = @"
select r.[Name]
from [UserRoles] ur
left join [Roles] r on r.RoleId = ur.RoleId
where ur.UserId = @userId;
";
return Task.Factory.StartNew(() => {
using (SqlConnection connection = new SqlConnection(_connectionString))
return connection.Query<string>(query, new { userId = user.UserId });
});
}
但不幸的是, Dapper.Query<T>
返回IEnumerable<T>
。
是否可以返回IList<T>
或者我必須自己進行轉換?
Dapper只保證向您提供IEnumerable<T>
。 所以你應該只假設這一點。 特別是,它已經擁有了不同的場景中它可以給你無論是填充的列表, 或延期迭代器。
最簡單的方法是調用.ToList()
。 如果您打算避免使用alloc,那么可以進行推測測試:
static IList<T> SpeculativeToList<T>(this IEnumerable<T> source)
{
return source as IList<T> ?? source.ToList();
}
只需調用.ToList()
就可以了嗎?
return connection.Query<string>(query, new { userId = user.UserId }).ToList();
這將枚舉IEnumerable<T>
並創建作為List<T>
找到的所有元素的內存中副本。
嘗試使用顯式強制轉換
return (IList<string>)connection.Query<string>(query, new { userId = user.UserId });
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.