비동기 메서드에서 toList ()를 사용하여 변환 할 수 없습니다.

asynchronous c# dapper

문제

Daemon을 사용하여 비동기식으로 만드는 메소드를 변경하려고합니다. 이것은 저장소 클래스의 현재 메소드입니다.

...
public class ClientsRepository : BaseRepository
    {
        public ClientsRepository(string connectionString): base (connectionString){  }
...

     public List<ClientSummaryModel> GetClientSummaryCredit(string id)
        {
            try
            {
                connection();
                con.Open();
                con.ChangeDatabase("PAQA");
                IList<ClientSummaryModel> SummaryClientList= SqlMapper.Query<ClientSummaryModel>(con, "dbo.SP_GET_CLIENT_SUMMARY '" + id + "','0','CREDIT'", CommandType.StoredProcedure).ToList();
                return SummaryClientList.ToList();

            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                con.Close();
            }
        }

나는 이것을 다음과 같이 비동기 적으로 만들려고 노력하고있다.

public async Task<List<ClientSummaryModel>> GetClientSummaryCredit(string id)
    {
        return await WithConnection(async c =>
        {
            c.ChangeDatabase("PAQA");
            IList<ClientSummaryModel> SummaryClientList= await c.QueryAsync<ClientSummaryModel>("dbo.SP_GET_CLIENT_SUMMARY '" + id + "','0','CREDIT'", CommandType.StoredProcedure).ToList();
            return SummaryClientList.ToList();
        });
    }

불행히도 다음 오류가 발생합니다.

암시 적으로 'System.Collections.Generic.IEnumerable'형식을 'System.Collections.Generic.IList'형식으로 변환 할 수 없습니다. 명시 적 변환이 존재합니다 (캐스트가 누락 되었습니까?).

첫 번째 방법처럼 돌아 오기 위해 변경해야 할 사항은 무엇입니까?

추가 정보 : 여기에 내가 하위 클래스로 만드는 저장소 기본 클래스입니다 :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;
using Dapper;


namespace AutorizarCreditoApp.Repositories
{
    public abstract class BaseRepository
    {
        private readonly string _ConnectionString;

        protected BaseRepository(string connectionString)
        {
            _ConnectionString = connectionString;
        }

        protected async Task<T> WithConnection<T>(Func<IDbConnection, Task<T>> getData)
        {
            try
            {
                using (var connection = new SqlConnection(_ConnectionString))
                {
                    await connection.OpenAsync(); // Asynchronously open a connection to the database
                    return await getData(connection); // Asynchronously execute getData, which has been passed in as a Func<IDBConnection, Task<T>>
                }
            }
            catch (TimeoutException ex)
            {
                throw new Exception(String.Format("{0}.WithConnection() experienced a SQL timeout", GetType().FullName), ex);
            }
            catch (SqlException ex)
            {
                throw new Exception(String.Format("{0}.WithConnection() experienced a SQL exception (not a timeout)", GetType().FullName), ex);
            }
        }

    }
}

인기 답변

코드 샘플에 두 가지 문제점이 있습니다.

첫째, await .ToList() 를 사용 하십시오. 즉, await 줄에 .ToList() 가 필요하지 않습니다.

둘째, 매개 변수가있는 쿼리를 사용 하십시오 . Dapper가 지원합니다 . 일반적으로 익명 형식의 개체를 사용하여 매개 변수 값을 선언하고 해당 개체를 param 매개 변수로 전달합니다. 저장 프로 시저의 경우 SQL의 일부로 매개 변수 자체를 제공하는 것이 아니라 매개 변수 자체의 이름을 알아야합니다. 아래에서는 저장 프로 시저에 @Id , @SomeNumber@CashOrCredit 이라는 세 개의 매개 변수가 있다고 가정합니다.

이 두 가지 제안을 통해 코드는 다음과 같이 보일 수 있습니다.

public async Task<List<ClientSummaryModel>> GetClientSummaryCredit(string id)
{
    return await WithConnection(async c =>
    {
        c.ChangeDatabase("PAQA");
        var summaryClientList =
            await c.QueryAsync<ClientSummaryModel>("dbo.SP_GET_CLIENT_SUMMARY",
                                                   new
                                                   {
                                                       Id = id,
                                                       SomeNumber = 0,
                                                       CashOrCredit = "CREDIT"
                                                   },
                                                   commandType: CommandType.StoredProcedure);
        return summaryClientList.ToList();
    });
}

참고 : 나는 당신이 using System.Linq; 있다고 추정한다 using System.Linq; 이 파일에



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.