IEnumerable과 IList 간의 변환 (Dapper 반환 결과)

.net asp.net-mvc c# dapper

문제

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> 를 반환 할 수 있습니까 아니면 직접 변환해야합니까?

수락 된 답변

명시 적 캐스트를 사용해보십시오.

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는 합법적입니까? 예, 이유를 알아보십시오.