Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 两个等待调用合并为一个语句_C#_Linq - Fatal编程技术网

C# 两个等待调用合并为一个语句

C# 两个等待调用合并为一个语句,c#,linq,C#,Linq,我已经搜索过了,但没有找到能澄清我对这个问题想法的东西。。 这段代码是一种糟糕的做法吗?或者有两个这样的等待电话可以吗? 我不确定这2个等待是否会遇到某种问题 var numero = await _context.xpto .AnyAsync(s => s.field1 == value1) ? await _context.xpto .Where(a => a.field1 == value1) .MaxAs

我已经搜索过了,但没有找到能澄清我对这个问题想法的东西。。 这段代码是一种糟糕的做法吗?或者有两个这样的等待电话可以吗? 我不确定这2个等待是否会遇到某种问题

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

同一语句中的两个
await
关键字没有本质上的错误

但是,此代码可能可以通过使用以下内容来简化:

var numero = await _context.xpto
    .Where(a => a.field1 == value1)
    .Select(a => a.field2)
    .DefaultIfEmpty(0)
    .MaxAsync();
与使用三元运算符处理查询为空的情况不同,
DefaultIfEmpty()
捕获此情况并返回单个默认值元素。这可能也更容易阅读,更能表达意图。而且它只需要对序列进行一次遍历(您的版本进行两次遍历)


但是回到你的问题,只要你意识到评估的顺序和可能的副作用,包括异步异常,多个
wait
s就没有问题。

在不使用条件运算符的情况下重写代码:

var any = await 
    _context.xpto.Any( //...);

int numero;

if (any)
{
    numero = 
       await _context.xpto
                     .Where(//...)
                     .MaxAsync(//...);
}
else
{
     numero = 0;
}

这看起来有什么不对吗?对我来说不是,你只是把一项等待的任务作为另一项等待任务的延续。

谢谢你的回答。我不熟悉DefaultIfEmpty(),但这对我没有帮助。我忘了提到,在我的特殊情况下,返回的对象类型没有初始化,因此默认值为null,我需要一个int值,它是对象的不可为null的属性。我的问题得到了回答,那是关于等待电话的问题。在这种情况下,它确实需要有这样的条件,这是我们发现的使方法正常工作的唯一解决方案。@ButterCumpCumberscapt在这种情况下,您可以(并且应该)使用
DefaultIfEmpty()
重载,该重载接受一个参数,指定要插入的值;只需输入0。这样做不仅可以为您节省一个额外的序列,而且还可以消除原子性问题的任何潜在问题。谢谢!当我昨天尝试它时,返回的类型是xpto对象类型。
Select
是这里的秘密。非常感谢。为了尊重整个应用程序的流程,这不是我想要的。谢谢你的回答:)