예제 #1
0
        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));
        }
예제 #2
0
 public abstract Task FindStudiesAsync(FindStudiesRequest request, CancellationToken ct);
예제 #3
0
        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);
        }