2016-08-02 5 views
1

Я пытаюсь изменить способ, чтобы сделать его асинхронным и используя щеголеватый Это текущий метод в хранилище класса:Не удается преобразовать с помощью ToList() в методе асинхронного

... 
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(); 
      } 
     } 

Пытаюсь сделать его ASync нравится:

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(); 
     }); 
    } 

к сожалению, я получаю следующее сообщение об ошибке:

Cannot implicitly convert type 'System.Collections.Generic.IEnumerable' to 'System.Collections.Generic.IList'. An explicit conversion exists (are you missing a cast?)

Что мне нужно изменить, чтобы вернуться, как первый метод?

Дополнительная информация: Вот это хранилище базовый класс, который я хочу подклассов:

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); 
      } 
     } 

    } 
} 
+0

Mmmm ... Я перехожу к тому методу toListAsync(), который вы предлагали, однако ... не доступен, но ... VS предлагает мне добавить пакет EntityFramework. Не уверен, что делать, потому что я использую Dapper, а не EF. –

+0

Да, не видел, что ... комментарий удален – ghg565

ответ

2

Я вижу две проблемы с вашим образцом кода.

Прежде всего, используйте .ToList()послеawait. Другими словами, вам не нужен номер .ToList() на линии await.

Во-вторых, используйте параметризованный запрос - Dapper supports it. Обычно вы используете анонимно типизированный объект для объявления значений параметров и передачи этого объекта в качестве параметра 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;.