![](/img/trans.png)
[英]Method for getting a list async? 'List<ListDefinition>' does not contain a definition for 'ToListAsync'
[英]Multiple queries in async/await (Error: IEnumerable does not contain ToListAsync())
我想分享一下,我經歷了其他類似的帖子,但建議的解決方案對我不起作用,這就是我創建一個單獨的線程的原因。我正在嘗試使用實體框架中的異步編程加入這兩個結果。我有三個方法如下:
PreprocessAppointment()
方法等待其他兩個方法GetApptTask()
和GetZoneTask()
public async void PreprocessAppointment()
{
var task_1 = GetApptTask();
var task_2 = GetZoneTask();
await Task.WhenAll(task_1, task_2);
}
方法GetApptTask()
不會給出任何錯誤。
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();
}
我無法找出可能導致此錯誤的原因 。我正在附加模型結構以及下面的appointments
和zones
。 除了字段之外,模型之間的唯一區別是zones
中Comparer
類的定義。
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; }
}
ToListAsync()
適用於IQueryable<T>
,當您通過AsEnumerable()
將其轉換為IEnumerable<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
的結果而不是重新計算它。
在GetApptTask方法中,返回行的結果是IQueryable,其中定義了擴展方法ToListAsync。 對GetZoneTask的調用具有AsEnumberable,它將IQueryable實現為IEnumberable,它沒有定義ToListAsync的擴展方法。
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
}
因為ToListAsync()僅適用於IQueryable,當您通過AsEnumerable()將其轉換為IEnumerable時,您無法調用它。 您可以在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();
}
正如@Scott Chamberlain所提到的,ToListAsync()可以使用
但你可以使用
方法而不是這個。
public async Task<IEnumerable<appointments>> GetApptTask()
{
var result = db.appointments.Where(d => d.appt_client_id == 15 && d.customer_id == 68009);
return await Task.FromResult(result);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.