C#使用Hl7.Fhir搜索FHIR Bundle时筛选或排除扩展的方法
Hl7.Fhir库搜索Bundle时过滤扩展的实现方案
首先明确核心前提:SearchParams是FHIR标准搜索参数的客户端封装,服务端侧的返回内容过滤能力受FHIR服务本身的实现限制,FHIR标准未强制要求服务支持扩展级别的细粒度返回筛选,因此分两类实现路径:
1. 服务端侧过滤(仅适配支持对应能力的FHIR服务)
配置不返回任何顶层扩展
通过FHIR标准的_elements参数,明确指定需要返回的顶层业务字段,未列入参数的顶层元素(含根级扩展)会被服务端自动排除,代码示例:
using Hl7.Fhir.Rest; var searchParams = new SearchParams(); // 替换为自身业务需要返回的顶层字段,不要添加extension字段 searchParams.Add("_elements", "id,meta,status,subject,encounter"); // 追加其他业务搜索条件 var resultBundle = await fhirClient.SearchAsync<Bundle>(searchParams);
配置仅返回指定顶层扩展
如果对接的FHIR服务定制支持扩展粒度的_elements筛选(标准无强制要求,仅部分自研服务实现),可以在参数中明确指定要保留的扩展URL,示例:
var searchParams = new SearchParams(); // 仅保留url为ABC、DEF的根级扩展,其余根级扩展由服务端过滤 searchParams.Add("_elements", "id,meta,extension:ABC,extension:DEF"); var resultBundle = await fhirClient.SearchAsync<Bundle>(searchParams);
注意:
_elements参数仅能控制资源顶层元素的返回,嵌套在其他元素/扩展内部的子扩展无法通过该参数过滤,且如果FHIR服务未实现扩展级筛选规则,该配置不会生效,会返回全量扩展。
2. 客户端侧过滤(通用兼容方案,无服务端依赖)
这是最稳妥的实现方式,不受FHIR服务端能力限制,拿到返回的Bundle后遍历所有资源,手动移除不符合要求的扩展即可,支持过滤任意层级的扩展,示例代码:
// 1. 正常执行搜索拿到Bundle结果 var searchParams = new SearchParams(); // 追加自身业务需要的搜索条件 var resultBundle = await fhirClient.SearchAsync<Bundle>(searchParams); // 2. 定义需要保留的扩展URL集合,需要过滤所有扩展则传空集合 HashSet<string> allowedExtensionUrls = new HashSet<string> { "ABC", "DEF" }; // 3. 遍历Bundle所有条目执行过滤 foreach (var entry in resultBundle.Entry) { if (entry.Resource is not DomainResource resource) continue; // 过滤根级扩展 resource.Extension = resource.Extension .Where(ext => allowedExtensionUrls.Contains(ext.Url)) .ToList(); // 过滤嵌套在扩展内部的子扩展(匹配示例中的嵌套扩展结构) foreach (var rootExt in resource.Extension.ToList()) { if (rootExt.Extension?.Any() == true) { rootExt.Extension = rootExt.Extension .Where(subExt => allowedExtensionUrls.Contains(subExt.Url)) .ToList(); } } }
如果需要实现完全不返回任何扩展,只需要将allowedExtensionUrls初始化为空集合,上述代码会自动清空所有层级的扩展内容。
内容的提问来源于stack exchange,提问作者Sandeep Ranjan
相关产品推荐
相关产品推荐

