两个人等待一个声明

时间:2018-01-08 18:20:54

标签: c# linq

我已经搜索过,但没有找到能够清除我对这个问题的看法的内容。 这段代码是不好的做法吗?或者可以有两个等待这样的呼叫吗? 我不确定这2个等待是否会以某种方式遇到某种问题。

var numero = await _context.xpto
            .AnyAsync(s => s.field1 == value1) ? await _context.xpto
            .Where(a => a.field1 == value1)
            .MaxAsync(a => a.field2) : 0;

2 个答案:

答案 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;
}

这看起来有点不对劲吗?对我而言,它不是,你只是在等待另一项等待任务的延续。