我已经搜索过,但没有找到能够清除我对这个问题的看法的内容。 这段代码是不好的做法吗?或者可以有两个等待这样的呼叫吗? 我不确定这2个等待是否会以某种方式遇到某种问题。
var numero = await _context.xpto
.AnyAsync(s => s.field1 == value1) ? await _context.xpto
.Where(a => a.field1 == value1)
.MaxAsync(a => a.field2) : 0;
答案 0 :(得分:3)
同一声明中的两个await
关键字没有任何内在错误。
但是,使用DefaultIfEmpty()
可能会简化此代码,如下所示:
var numero = await _context.xpto
.Where(a => a.field1 == value1)
.Select(a => a.field2)
.DefaultIfEmpty(0)
.MaxAsync();
而不是使用三元运算符来处理查询为空的情况,DefaultIfEmpty()
捕获此情况并返回单个默认值元素。这可能也更容易阅读,更能表达意图。它只需要一次通过序列(你的版本可以通过两次)。
但回到你的问题,只要你意识到评估的顺序和可能的副作用,包括异步异常,多个await
就没有错。
答案 1 :(得分:0)
在没有条件运算符的情况下重写代码:
var any = await
_context.xpto.Any( //...);
int numero;
if (any)
{
numero =
await _context.xpto
.Where(//...)
.MaxAsync(//...);
}
else
{
numero = 0;
}
这看起来有点不对劲吗?对我而言,它不是,你只是在等待另一项等待任务的延续。