2016-07-15 12 views
1

私は他の同様の投稿を行ったとお伝えしたいと思いますが、提案されたソリューションは私にとってはうまく動作しません。async/awaitで複数のクエリ(エラー:IEnumerableにToListAsync()が含まれていません)

他の2つの方法GetApptTask()GetZoneTask()

public async void PreprocessAppointment() 
     { 
      var task_1 = GetApptTask(); 
      var task_2 = GetZoneTask(); 
      await Task.WhenAll(task_1, task_2); 
     } 

GetApptTask()方法で待機PreprocessAppointment()方法:thread.Iは、Entity Framework.Iで非同期プログラミングを使用して、2つの結果を持っているとして、以下の3つのメソッドを参加しようとしています何の誤りもない。

public async Task<IEnumerable<appointments>> GetApptTask(){ 

      var result = db.appointments.Where(d => d.appt_client_id == 15 && d.customer_id == 68009); 

      return await result.ToListAsync(); 


     } 

GetZoneTask()の方法では、次のエラーが発生します。 IEnumerable <zones> does not contain definition for ToListAsync()

public async Task <IEnumerable<zones>> GetZoneTask() 
     { 
      var result = db.zones.Where(d => d.zone_client_id == "15").AsEnumerable().Distinct<zones>(new zones.Comparer()); 
      return await result.ToListAsync(); 
     } 

私はこのエラー .Iはappointments以下zonesのためだけでなくモデルの構造を装着してい引き起こしている可能性があります何かを見つけることができません。フィールド以外のモデルの唯一の違いはのComparerクラスの定義です。あなたはAsEnumerable()経由IEnumerable<T>にそれを回したときに

zones.cs

public class zones 
    { 
     [Column(Order=0),Key] 
     [StringLength(50)] 
     public string zone_client_id { get; set; } 
     //public int zone_client_id { get; set; } 

     [Column(Order = 1), Key] 
     [StringLength(5)] 
     public string zip { get; set; } 


     [StringLength(50)] 
     public string zone { get; set; } 

     public class Comparer : IEqualityComparer<zones> 
     { 
      public bool Equals(zones x, zones y) 
      { 
       return x.zone_client_id == y.zone_client_id 
        && x.zip == y.zip 
        && x.zone == y.zone; 
      } 

      public int GetHashCode(zones obj) 
      { 
       return obj.zone_client_id.GetHashCode()^
         obj.zip.GetHashCode()^
         obj.zone.GetHashCode(); 
      } 
     } 
    } 

appointments.cs

public partial class appointments 
    { 

     public int appt_client_id { get; set; } 

     public int customer_id { get; set; } 

     [Key] 
     public int appt_id { get; set; } 

     public DateTime appt_date_time { get; set; } 

     [StringLength(200)] 
     public string recording_uri { get; set; } 

     public DateTime time_stamp { get; set; } 

     [Required] 
     [StringLength(20)] 
     public string appt_status { get; set; } 

     [Required] 
     [StringLength(5)] 
     public string appt_type { get; set; } 
} 
+1

は、あなたが正しい使用して文を持っていますか? System.Dataを使用します。エンティティ – Mangist

答えて

3

ToListAsync()IQueryable<T>の作品は唯一、あなたは能力を失いましたあれを呼べ。

あなたがいったんAsEnumerable()を実行すると、インメモリコレクションを使用しているので、その時点でリストにするだけです。

var allZones = await db.zones.Where(d => d.zone_client_id == "15").ToListAsync().ConfigureAwait(false); 
return allZones.Distinct<zones>(new zones.Comparer()).ToList(); 

最後.ToList()はオプションです。あなたがそれをしない場合、返されたIEnumerableを複数回列挙すると、Distinctを何度も実行します。余分に.ToList()を実行すると、再計算する代わりにDistinctの結果を「覚えている」ようになります。

+0

私はどのような変更を行うべきかお勧めしますか? IEnumerableに結果を型変換する必要がありますか? –

+0

@ RudraniAngira、確かに、更新された答え。 –

+0

私はあなたが提案したソリューションを試してみましたが、何とかコントロールがvar allZones = db.zones.Where(d => d.zone_client_id == "15")を待っているからです。 –

2

GetApptTaskメソッドでは、返される行の結果は、メソッドToListAsyncが定義されたIQueryableです。 GetZoneTaskへの呼び出しには、IQueryableを拡張メソッドToListAsyncが定義されていないIEnumberableに実現するAsEnumberableがあります。あなたはAsEnumerable経由のIEnumerableにそれを回したときに

public async Task<IEnumerable<appointments>> GetApptTask(){ 
     var result = db.appointments.Where(d => d.appt_client_id == 15 && d.customer_id == 68009); 
     return await result.ToListAsync();//result was an IQueryable here 
    } 

public async Task <IEnumerable<zones>> GetZoneTask() 
    { 
     var result = db.zones.Where(d => d.zone_client_id == "15").AsEnumerable().Distinct<zones>(new zones.Comparer()); 
     return await result.ToListAsync();//here result is an IEnumberable because of the above call to AsEnumberable 
    } 
0

ToListAsyncは()のIQueryableに動作するためには、のみ、()あなたはそれを呼び出す機能を失いました。 IEnumerableシーケンスで.AsQueryable()を呼び出すと、IQueryableが返されます。例えば

private async Task<List<MyModelType>> GetAsyncListFromIEnumerable(
    List<MyModelIEnumerableType> mylist, 
    DateTime startDate, 
    DateTime endDate) 
{ 
    var result = from e in mylist 
       where e.StartDate >= startDate 
       && e.EndDate <= endDate 
       select new MyModelIEnumerableType 
       { 
       // Set of the properties here 
       }; 
    return await result.AsQueryable().ToListAsync(); 
} 
関連する問題