public override async Task FindStudiesAsync(FindStudiesRequest request, CancellationToken ct) { var studiesInDir = await WaitForStudiesInDirAsync(ct); var query = studiesInDir.Values.AsQueryable(); var patientName = string.Empty; if (!string.IsNullOrWhiteSpace(request.Family)) { patientName += request.Family; } if (!string.IsNullOrWhiteSpace(request.FirstName)) { if (string.IsNullOrWhiteSpace(patientName)) { patientName += '*'; } patientName += '^' + request.FirstName; } if (!string.IsNullOrWhiteSpace(patientName)) { query = query.Where(s => Where(s.PatientName, patientName, StringComparison.InvariantCultureIgnoreCase)); } if (!string.IsNullOrWhiteSpace(request.PatientId)) { query = query.Where(s => Where(s.PatientId, request.PatientId, StringComparison.Ordinal)); } if (!string.IsNullOrWhiteSpace(request.Description)) { query = query.Where(s => Where(s.StudyDescription, request.Description, StringComparison.InvariantCultureIgnoreCase)); } if (request.From.HasValue || request.To.HasValue) { var from = request.From.GetValueOrDefault(DateTime.MinValue); var to = request.To.GetValueOrDefault(DateTime.MaxValue); query = query.Where(s => s.StudyDate.HasValue && s.StudyDate >= from && s.StudyDate <= to); } Parallel.ForEach(query, study => request.RaiseStudyFound(study)); }
public abstract Task FindStudiesAsync(FindStudiesRequest request, CancellationToken ct);
public override async Task FindStudiesAsync(FindStudiesRequest request, CancellationToken ct) { var query = DicomCFindRequest.CreateStudyQuery(); var patientName = string.Empty; if (!string.IsNullOrWhiteSpace(request.Family)) { patientName += request.Family; } if (!string.IsNullOrWhiteSpace(request.FirstName)) { if (string.IsNullOrWhiteSpace(patientName)) { patientName += '*'; } patientName += '^' + request.FirstName; } if (!string.IsNullOrWhiteSpace(patientName)) { query.Dataset.AddOrUpdate(DicomTag.PatientName, patientName); } if (!string.IsNullOrWhiteSpace(request.PatientId)) { query.Dataset.AddOrUpdate(DicomTag.PatientID, request.PatientId); } if (!string.IsNullOrWhiteSpace(request.Description)) { query.Dataset.AddOrUpdate(DicomTag.StudyDescription, request.Description); } if (request.From.HasValue || request.To.HasValue) { var from = request.From.GetValueOrDefault(DateTime.MinValue); var to = request.To.GetValueOrDefault(DateTime.MaxValue); query.Dataset.AddOrUpdate(DicomTag.StudyDate, new DicomDateRange(from, to)); } query.Dataset.AddOrUpdate(DicomTag.StudyID, string.Empty); query.OnResponseReceived += (req, resp) => { if (!ct.IsCancellationRequested && resp.Dataset != null) { var study = resp.Dataset.CreateObject <Study>(); if (study == null) { _logger.Error("Study creation failed"); } else { request.RaiseStudyFound(study); } } }; await FindAsync <Study>(query, _settings, _findStudiesSemaphore, ct); }