改进获取"if only one"查询



我试图得到如果我只有一个发布的订单,但我认为我可以使用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;

如何提高查询的可读性和可维护性?

您不需要WhereCount也可以有一个谓词,使得它只计算满足条件的元素。所以你可以直接输入

return orders?.Count(x => x.Status == Status.Posted.ToString()) == 1;

如果ordersnull,那么orders?.Count(...)也将返回null,null == 1将返回false

如果ordersnull不同,则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(...)将遍历所有元素以检查条件。

最新更新