gpt4 book ai didi

c# - 异步/等待中的多个查询(错误 : IEnumerable does not contain ToListAsync())

转载 作者:行者123 更新时间:2023-11-30 19:15:28 32 4
gpt4 key购买 nike

我想分享一下,我浏览过其他类似的帖子,但建议的解决方案对我不起作用,这就是为什么我要创建一个单独的线程。我正在尝试使用 Entity Framework 中的异步编程来加入这两个结果。我有以下三种方法:

方法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以下。除了字段之外,模型之间的唯一区别是 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> 上工作只有,当你把它变成一个IEnumerable<T>通过AsEnumerable()你失去了调用它的能力。

因为一旦你做了 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 的结果而不是重新计算它。

关于c# - 异步/等待中的多个查询(错误 : IEnumerable does not contain ToListAsync()),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38402824/

32 4 0