Как использовать FhirDotNet для получения списка свойств, которые различаются между двумя ресурсами одного типа

Я использую API-интерфейс Fhir-dotnet для взаимодействия с нашим сервером Fhir, чтобы синхронизировать записи пациентов с нашим внутренним репозиторием пациентов. У меня есть два экземпляра ресурса Patient: один представляет версию в нашем исходном репозитории, а другой представляет пациента в Fhir. Я хотел бы применить подмножество изменений из исходной версии репозитория пациента к Fhir-версии пациента и попытался использовать метод CopyTo (), но это также удаляет все данные, которые существовали только в Fhir-версии пациента.

В идеале я хочу обновлять только те свойства в версии Fhir пациента, где у меня есть данные в версии исходного репозитория пациента (поля, которые не равны нулю в исходной версии пациента), и оставлять любые данные, которые существовали только в Fhir. репозиторий. Любые данные, которые были добавлены в версию Fhir пациента в результате их взаимодействия с API с помощью своего мобильного приложения, следует оставить в покое (если они не обновили свойство, которое я также пытаюсь синхронизировать).

Поскольку CopyTo () кажется полной заменой одного ресурса на другой (а не аддитивной копией и игнорированием полей, которые имеют нулевое значение в soruce), мне нужно иметь возможность сравнивать два ресурса одного и того же типа и получать список свойств изменения между ними. Похоже, что есть несколько базовых классов для поддержки этого в IsMatch () с использованием IDeepCopy и IDeepComparison, и я также заметил в разделе заметок GitHub, что есть поддержка для обнаружения различий.

Вспомогательные классы для работы с метаданными спецификации, в первую очередь с StructureDefinition и генерацией дифференциалов.

Итак, мой вопрос: существуют ли существующие классы в Fhir DOTNET API, которые могут дать мне список изменений между двумя экземплярами одного и того же типа resoruce, и если да, то какие классы они будут с возможным примером? Если нет, то есть ли существующий шаблон, который я мог бы использовать, чтобы дать мне список свойств, которые различаются между двумя экземплярами одного и того же типа, которые можно использовать для присвоения значений между ними. Похоже, чтобы сгенерировать список реальных свойств, нужно много размышлений, а не просто список пар строк "имя-значение". Если в Fhir.NET API для этого нет поддержки, то я хотел бы написать псевдокод, аналогичный приведенному ниже ...

  • Получить пациента-источника
  • Получить целевого пациента
  • Для каждого измененного свойства (глубокое сравнение между источником и целью) обновите цель с помощью свойства источника.

person Geekn    schedule 28.09.2019    source источник
comment
Как вы будете справляться с ситуациями, когда данные существуют в каждой версии, но разные. Например. разные даты рождения, разные адреса и т. д.?   -  person Lloyd McKenzie    schedule 28.09.2019
comment
При синхронизации я записываю номер версии и дату последнего обновления из Fhir. Когда я извлекаю текущего пациента, его версия сравнивается с номером последней синхронизированной версии. Если текущая версия больше, чем последняя синхронизированная версия, запросите историю с помощью API на момент последнего обновления, а затем используйте тот же класс, с которым я прошу помощи, для создания списка изменений, которые произошли с момента последней синхронизации между каждой исторической записью. . Этот список свойств не будет обновляться, поскольку эти поля более свежие.   -  person Geekn    schedule 28.09.2019
comment
Это не код dotnet, но этот код делает то, что вы хотите, если вам нужен псевдокод: github.com/grahamegrieve/fhirserver/blob/master/library/tools/   -  person Grahame Grieve    schedule 28.09.2019


Ответы (1)


Вы можете использовать функцию NamedChildren() для любого элемента, чтобы получить потомков по имени. Имея этот список, вы можете использовать метод IsExactly(), чтобы сравнивать их один за другим! Конечно, вам придется иметь дело с вложенными группами FHIR (например, Patient.contact), которые могут нуждаться в другом лечении.

person Ewout Kramer    schedule 30.09.2019
comment
Это могло быть полезно. Я шел по пути создания общей реализации, основанной на передаче ресурсов и использования метода Children () рекурсивно для каждого дочернего элемента, который базовый класс, но затем столкнулся с загвоздкой, когда мне пришлось добавить дочерний элемент, который не существует в мишени. Я не вижу в базовом классе метода для добавления дочернего элемента в коллекцию Children. Очень близко. - person Geekn; 30.09.2019
comment
При попытке создать общую копию между любыми двумя ресурсами FHIR (одна функция для объединения любых двух ресурсов FHIR одного типа. Именованные коллекции не существуют на этом уровне (ресурс), но я попытался рекурсивно пройти каждый объект, используя Children ( ). Я могу присваивать значения друг другу, используя эту коллекцию, если они существуют в обоих, но не могу понять, как добавить элемент в список на этом уровне, потому что нет метода Add () для именованных потомков для случаев, когда элемент существует в одном ресурсе, и я хочу добавить его в другой, где он отсутствует. - person Geekn; 24.10.2019