我试图得到如果我只有一个发布的订单,但我认为我可以使用linq改进查询。到目前为止,我有这个:
var orders = await _ordersService.Get(id);
var ordersPosted = orders?.Where(x => x.Status == Status.Posted.ToString());
if (ordersPosted == null || !ordersPosted.Any()) return false;
return ordersPosted.Count() == 1;
如何提高查询的可读性和可维护性?
您不需要Where
。Count
也可以有一个谓词,使得它只计算满足条件的元素。所以你可以直接输入
return orders?.Count(x => x.Status == Status.Posted.ToString()) == 1;
如果orders
是null
,那么orders?.Count(...)
也将返回null
,null == 1
将返回false
。
如果orders
与null
不同,则orders?.Count(...)
将返回枚举中元素的个数。因此,只有当orders
true
你可以在online online中做所有的事情
return (await _ordersService.Get(id))?.Count(x => x.Status == Status.Posted.ToString()) == 1;
根据@NataliaMuray和@mjwills的建议,您可以按照以下方式优化性能
return orders?
.Where(x => x.Status == Status.Posted.ToString())
.Take(2)
.Count() == 1;
这将在找到第二个元素时立即停止搜索orders
枚举,而orders?.Count(...)
将遍历所有元素以检查条件。