【发布时间】:2021-01-29 15:34:30
【问题描述】:
我想使用异步等待功能按年龄分组。没有 aync 等待它工作正常,但我想要 使用异步等待。 如果我在第一行中排除 ToList() ...从 db.Patient.ToList() 中的 u ... 那么我会遇到 CalculateAge 函数的问题 错误 LINQ Entities 在方法 CalculateAge(system.String).. 中无法识别 这就是为什么在那里使用它。 CalculateAge 函数是计算年龄,这里是代码函数
private int CalculateAge(string birthday)
{
int age;
if (string.IsNullOrWhiteSpace(birthday)) return 0;
DateTime empBirthday = Convert.ToDateTime(birthday);
DateTime today = DateTime.Today;
age = today.Year - empBirthday.Year;
if (empBirthday > today.AddYears(-age))
age--;
return age;
}
没有异步等待也可以正常工作
private void btnByAge_Click(object sender, EventArgs e)
{
var result = (from u in db.Patient.ToList() //
join a in db.Analys on u.PatientId equals a.PatientId
where a.Status == Active
group u by CalculateAge(u.DOB.ToString()) into g
select new
{
Age = g.Key,
Amount = g.Count(),
}).Tolist();
if (result != null)
{
dgvResult.DataSource = result;
}
}
但异步等待不是这个
private async void btnByAge_Click(object sender, EventArgs e)
{
var result = (from u in db.Patient.ToListAsync()
join a in db.Analys on u.PatientId equals a.PatientId
where a.Status == Active
group u by CalculateAge(u.DOB.ToString()) into g
select new
{
Age = g.Key,
Amount = g.Count(),
});
var data = await result.ToListAsync();
if (data != null)
{
dgvResult.DataSource = data;
}
}
我得到的错误是错误 CS1936 找不到源类型“任务>”的查询模式的实现。未找到“加入”... 我什至使用过 Using.System.Data.Linq ,但同样的问题。请帮忙,提前谢谢!
【问题讨论】:
-
您需要等待
db.Patient.ToListAsync()的来电。最好在 DB 上进行 join 和 where 过滤,然后调用AsEnumerable,以便您可以在 group by 中调用CalculateAge。或者甚至更好地将CalculateAge所做的任何事情翻译成可以翻译成 SQL 的代码。 -
@juharr 谢谢你的回复,但我是这种员工的新手,你能通过编码告诉我你的意思吗?
-
CalculateAge是做什么的?你能提供它的实现吗? -
另外,
CalculateAge使用string而不是DateTime,这很奇怪。
标签: c# linq asynchronous async-await