1

我正在使用ASP.Net Boilerplate。我已經實現了IRepository來創建一個定製的Repository,所以我可以添加一個自定義的方法來從一個存儲過程返回數據。但是,不管我怎麼似乎結構任務,異步或等待組件我收到以下錯誤:從ASPNetBoilerplate中的SqlQuery定製存儲庫訪問ToListAsync()

System.InvalidOperationException: The provider for the source IQueryable doesn't implement IDbAsyncQueryProvider. Only providers that implement IDbAsyncQueryProvider can be used for Entity Framework asynchronous operations. For more details see http://go.microsoft.com/fwlink/?LinkId=287068. 

我的倉庫看起來像:

namespace myApp.EntityFramework.Repositories 
{ 
    public class TruckRepository : UHaulTrucks.HoustonRepositoryBase<DailyDockQuery>, ITruckRepository 
    { 

        public TruckRepository(IDbContextProvider<UHaulHoustonDbContext> dbContextProvider) : base(dbContextProvider) 
        { 

        } 

  public IQueryable<DailyDockQuery> GetDailyDockQuery() 
        { 

           var ret = Context.Database.SqlQuery<DailyDockQuery>("exec Central_DailyDockQuery").AsQueryable(); 
            return ret; 
        } 
   } 
} 

我的服務:

public async Task<PagedResultOutput<DailyDockQueryListDto>> GetDailyDockQuery() 
        { 
            var query = _truckRepository.GetDailyDockQuery(); 

            var dailyCount = await query.CountAsync(); 


            var dailies = await query.ToListAsync(); 

            var dailiesDtos = dailies.MapTo<List<DailyDockQueryListDto>>(); 

            return new PagedResultOutput<DailyDockQueryListDto>(
                dailyCount, 
                dailiesDtos 
               ); 
        } 

上述錯誤將在任何嘗試執行異步方法時生成,例如:

var dailyCount = await query.CountAsync(); 

var dailies = await query.ToListAsync(); 

正如我提到我曾嘗試在資源庫和服務與任務,並具有相同的結果異步組合幾種變化。我是以這種方式實現自定義存儲庫的新手,並且懷疑,儘管我應該從IRepository中獲得CountAsync和ToListAsync的好處,但仍需要在自定義類中實現這些優點。

任何幫助,非常感謝。仍然在這裏找到我的方式。

+1

是不是存儲庫什麼失敗,是提供者,你的數據庫連接器。 – Gusman

回答

0

執行存儲過程(選擇記錄)的示例代碼中Aspnetboilerplate:

public async Task<List<string>> GetUserNames() 
{ 
    EnsureConnectionOpen(); 

    using (var command = CreateCommand("GetUsernames", CommandType.storedProcedure)) 
    { 
     using (var dataReader = await command.ExecuteReaderAsync()) 
     { 
      var result = new List<string>(); 

      while (dataReader.Read()) 
      { 
       result.Add(dataReader["UserName"].ToString()); 
      } 

      return result; 
     } 
    } 
} 

我強烈建議你閱讀的文檔有關使用Aspnetboilerplate存儲過程。有你需要的一切: https://www.codeproject.com/Articles/1199648/Using-Stored-Procedure-User-Defined-Function-and-V#DocStoredProcedure