2016-05-04 10 views
0


Web API 2を使用してASP.NET MVCに新しくなりました。asp.net MVC with Web APIを使用してasyncとawaitメソッドを作成しました。 2はSQL DBに格納されます。 APIコントローラでリポジトリメソッドを呼び出そうとすると、エラーが発生し、 "system.collections.generic.list"を待てません。誰かがそれについてのアイデアを持っていれば、親切に私に知らせてください。
注:エンティティ・フレームワークを使用したくない代わりに、ストアド・プロシージャを使用してデータを格納したいとします。asp.netで非同期と待機メソッドを作る方法Web api2でMVCを作成する

Model: 
 

 
namespace AsyncMVCWEBAPI.Models 
 
{ 
 
    public class Product 
 
    { 
 
     public string Name { get; set; } 
 
     public double Price { get; set; } 
 
     public string Category { get; set; } 
 
    } 
 
} 
 

 
API Controller: 
 

 
public static async Task<Product> GetProduct() 
 
{ 
 
    return await GetAllProduct(); // Here i'm getting an error can not await "system.collections.generic.list" 
 
} 
 

 
Repository: 
 

 
public static IEnumerable<Product> GetAllProduct() 
 
{   
 
    using (SqlConnection con = new SqlConnection(connectionString)) 
 
    { 
 
     if (con.State == ConnectionState.Closed) 
 
      con.Open(); 
 
     List<Product> students = new List<Product>(); 
 
     SqlCommand cmd = new SqlCommand("spGetAllStudentDetails", con); 
 
     cmd.CommandType = CommandType.StoredProcedure; 
 

 
     SqlDataReader rdr = cmd.ExecuteReader(); 
 
     while (rdr.Read()) 
 
     { 
 
      Product product = new Product(); 
 
      product.Price = Convert.ToInt32(rdr["Price"]); 
 
      product.Name = rdr["Name"].ToString(); 
 
      product.Category = rdr["Category"].ToString(); 
 

 
      students.Add(product); 
 

 
     } 
 
     return students; 
 
    }   
 
}

enter image description here

答えて

3

主な問題は、あなたが非同期ではない方法を待つことができないということです。前の回答が言ったように

... 
    await con.OpenAsync(); 
    ... 
    SqlDataReader rdr = await cmd.ExecuteReaderAsync(); 
    while (await rdr.ReadAsync()) 
    { 
     ... 
     students.Add(product); 
    } 
    return students; 
+0

あなたの素晴らしいサポートIvan Yurievさん、ありがとうございます。 con.OpenAsync()とcon.Open()、rdr.ReadAsync()、rdr.Read()を待つ間の違いは、cmd.ExecuteReaderAsync()を待ち、cmd.ExecuteReader()を待つことです。親切に私に知らせてください? –

+0

これらのメソッドは、.net 4.5のasync \ await機能を使用するのに役立ちます。主な考え方は、非同期コードの作成を簡略化することです(asyncはマルチスレッド化ではありません)。したがって、あなたの主なスレッドは、Webリクエスト、データベースコールなどを待っている間は無料です。また、リソースをより効率的に活用するため、公式マニュアルhttps://msdn.microsoftで読むことをお勧めします。 .com/ja-us/library/hh191443.aspx –

+0

ありがとうIvan Yuriev。それは非常に便利です。 –

0

public static async Task<IEnumerable<Product>> GetAllProduct() 
また

は、データベースからデータを取得するために、非同期メソッドを使用することを忘れないでください:あなたは、次のシグネチャを持つ非同期(async)それを作るためにあなたのGetAllProductメソッドを書き換える必要がありますあなたがあなたの署名を変更する必要があります:あなたはADO.NET定型のものをスキップしたい場合は

public static async Task<IEnumerable<Product>> GetAllProduct() 

、あなたの代わりに使用することができますDapperhttps://github.com/StackExchange/dapper-dot-net)を使用してコードを簡略化してください。

public static async Task<IEnumerable<Product>> GetAllProduct() 
{ 
    using (var con = new SqlConnection(connectionString)) 
    { 
     await con.OpenAsync(); 
     return await con.QueryAsync<Product>("spGetAllStudentDetails", commandType: CommandType.StoredProcedure); 
    } 
} 
関連する問題