如何在Azure Cost Management QueryFilter中赋值'And'并筛选单日成本数据
如何筛选Azure Cost Management的单日成本数据并正确初始化QueryFilter的And集合?
核心问题与当前困境
- 核心问题:如何筛选Azure Cost Management的单日成本数据?
- 当前困境:QueryFilter的And字段为只读属性,无法直接赋值新List,导致构造多条件筛选失败。
背景场景
我基于Azure Function App开发了一个工具,用于查询100+个订阅的成本分析数据并导出到Azure Data Lake存储Blob。虽然Azure门户有内置导出功能,但存在两个痛点:一是无法高效部署和管理批量订阅的导出任务,新增订阅时扩展性差;二是内置导出最多支持WeekToDate时间范围,无法筛选单日数据。因此自行开发应用实现需求,但在构造QueryFilter时遇到了问题。
现有QueryDefinition初始化代码:
var queryDef = new QueryDefinition( ExportType.ActualCost, TimeframeType.WeekToDate, queryFilter );
遇到问题的QueryFilter构造代码:
var queryFilter = new QueryFilter { And = new List<QueryFilter> { new() { Dimensions = new QueryComparisonExpression("string", QueryOperatorType.In, new List<string>()) }, new() { Dimensions = new QueryComparisonExpression("string", QueryOperatorType.In, new List<string>()) }, } }; var queryDataset = new QueryDataset { Filter = queryFilter, };
错误提示
Property or indexer 'QueryFilter.And' cannot be assigned to -- it is read only
The logical "AND" expression. Must have at least 2 items.
查看QueryFilter类定义可知,And是只读属性,但构造函数已初始化了ChangeTrackingList集合:
/// <summary> The logical "AND" expression. Must have at least 2 items. </summary> public IList<QueryFilter> And { get; } /// <summary> Initializes a new instance of QueryFilter. </summary> public QueryFilter() { And = new ChangeTrackingList<QueryFilter>(); Or = new ChangeTrackingList<QueryFilter>(); }
正确实现方法
由于And属性只读,不能直接赋值新List,需往构造函数初始化好的集合中直接添加元素;同时要修改时间范围配置实现单日数据筛选:
// 初始化QueryFilter实例 var queryFilter = new QueryFilter(); // 往And集合添加筛选条件(至少2个) queryFilter.And.Add(new QueryFilter { Dimensions = new QueryComparisonExpression("UsageDate", QueryOperatorType.Equal, new List<string> { "2024-05-20" }) }); queryFilter.And.Add(new QueryFilter { Dimensions = new QueryComparisonExpression("SubscriptionId", QueryOperatorType.In, new List<string> { "sub-id-1", "sub-id-2" }) }); // 构造QueryDataset var queryDataset = new QueryDataset { Filter = queryFilter, }; // 配置单日时间范围:改用Custom类型,设置左闭右开的时间区间 var queryDef = new QueryDefinition( ExportType.ActualCost, TimeframeType.Custom, queryFilter ) { TimePeriod = new QueryTimePeriod { StartDate = DateTime.Parse("2024-05-20"), EndDate = DateTime.Parse("2024-05-21") // Cost Management时间范围为左闭右开,结束日期设为目标日期次日 } };
关键说明
- 只读集合操作:利用构造函数已初始化的
ChangeTrackingList,通过Add方法添加子筛选条件,确保And集合元素数量≥2,符合API要求。 - 单日数据筛选:将
TimeframeType改为Custom,通过TimePeriod指定精确的开始/结束日期(遵循左闭右开规则),即可获取单日成本数据。 - 批量订阅扩展:可通过配置文件或数据库批量读取订阅ID,动态添加到筛选条件中,新增订阅时仅需更新配置即可实现扩展,适配100+订阅的场景。
内容的提问来源于stack exchange,提问作者Tdawg90
相关产品推荐
相关产品推荐

