C# 两个等待调用合并为一个语句
我已经搜索过了,但没有找到能澄清我对这个问题想法的东西。。 这段代码是一种糟糕的做法吗?或者有两个这样的等待电话可以吗? 我不确定这2个等待是否会遇到某种问题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
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
是这里的秘密。非常感谢。为了尊重整个应用程序的流程,这不是我想要的。谢谢你的回答:)