Dotnet中FHIR Bundle按Resource.Effective过滤的日期对比问题咨询
解决方案
你遇到的问题核心是HL7 FHIR的FhirPath查询语法要求日期对比的两个操作数类型必须一致,你之前的写法均未满足该规则,因此触发报错。
正确实现方式
方案1:使用FhirPath日期字面量语法
FhirPath中以@开头、符合ISO 8601格式的内容会被自动识别为日期类型,不需要加单引号,示例代码如下:
// 先将.NET DateTime转为符合ISO 8601规范的日期字符串 string filterDate = new DateTime(2016, 1, 1).ToString("yyyy-MM-dd"); // 拼接查询时给日期值加@前缀,标识为FhirPath日期类型 var filteredResources = res.Select($"entry.resource.where(effective >= @{filterDate})");
方案2:显式转换字符串为日期类型
如果需要保留字符串传参的写法,可以调用FhirPath内置的toDateTime()方法,手动将字符串转为日期类型,示例代码如下:
string filterDateStr = new DateTime(2016, 1, 1).ToString("yyyy-MM-dd"); var filteredResources = res.Select($"entry.resource.where(effective >= '{filterDateStr}'.toDateTime())");
此前尝试失败的原因
- 尝试1:单引号包裹的
2016-01-01被识别为String类型,和effective字段的DateTime类型不匹配,无法直接对比 - 尝试2:.NET DateTime默认ToString()输出的是本地化格式的字符串,仍然被识别为String类型,同样存在类型不匹配问题
- 尝试3:去掉单引号后,DateTime默认ToString()输出的内容包含
/、空格等不符合FhirPath语法的字符,直接导致查询编译失败
内容的提问来源于stack exchange,提问作者AMFerreira
相关产品推荐
相关产品推荐

