public async Task <SearchResult <Classifier> > Search(ClassifierSearchRequest request, CancellationToken cancellationToken) { var type = await _classifierTypeService.Get(request.TypeCode, cancellationToken); using (var db = _dbContextFactory.Create()) { var result = await SearchInternal(db, type, request, cancellationToken); // search in data by Uid is not effective - O(n), but ok for small collections if (request.FocusUid.HasValue && result.Rows.Any(x => x.Uid == request.FocusUid) == false) { // todo: add test var focus = await SearchInternal(db, type, new ClassifierSearchRequest { Uid = request.FocusUid, SkipPaging = true }, cancellationToken); for (var i = focus.Rows.Count - 1; i >= 0; i--) { result.Rows.Insert(0, focus.Rows[i]); } } // todo: preload fields for multiple items or (?) store fields in the same table? if (request.IncludeFields) { var metadata = await _metadataService.GetMetadata(type, cancellationToken); foreach (var item in result.Rows) { var fields = await _fieldDataRepository.Search(new FieldDataSearchRequest { Metadata = metadata, EntityTypeCode = Classifier.TypeCode, // ReSharper disable once PossibleInvalidOperationException EntityUids = new[] { item.Uid.Value } }, cancellationToken); item.Fields = fields.Rows.SingleOrDefault(); } } return(result); } }