IEnumerableとIListの間の変換(Dapper戻り結果)

.net asp.net-mvc c# dapper

質問

UserManagerメソッドのシグネチャがあります(ASP .NET IDコアのデフォルトの実装)。

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>を返すことは可能ですか、自分で変換する必要がありますか?

受け入れられた回答

明示的なキャストを使用するようにしてください

return (IList<string>)connection.Query<string>(query, new { userId = user.UserId });

エキスパート回答

DapperはあなたにIEnumerable<T>を渡すことしか保証しません。だからあなたはそれを仮定するべきです。特に、それはすでに、それはあなたに取り込まリスト、 または繰延イテレータのいずれかを与えることができますさまざまなシナリオがあります。

最も簡単な方法は、 .ToList()呼び出すこと.ToList() 。あなたがallocを避けることを意図しているなら、投機的なテストをするかもしれません:

static IList<T> SpeculativeToList<T>(this IEnumerable<T> source)
{
    return source as IList<T> ?? source.ToList();
}


ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ