Пример #1
0
        public async Task <NotificationMessageSearchResult> SearchMessageAsync(NotificationMessageSearchCriteria criteria)
        {
            var result = new NotificationMessageSearchResult();

            using (var repository = _repositoryFactory())
            {
                //Optimize performance and CPU usage
                repository.DisableChangesTracking();

                result.Results = new List <NotificationMessage>();
                var query     = BuildQuery(repository, criteria);
                var sortInfos = BuildSortExpression(criteria);

                result.TotalCount = await query.CountAsync();

                if (criteria.Take > 0)
                {
                    var messageIds = await query.OrderBySortInfos(sortInfos).ThenBy(x => x.Id)
                                     .Select(x => x.Id)
                                     .Skip(criteria.Skip).Take(criteria.Take)
                                     .ToArrayAsync();

                    var unorderedResults = await _messageService.GetNotificationsMessageByIds(messageIds);

                    result.Results = unorderedResults.OrderBy(x => Array.IndexOf(messageIds, x.Id)).ToList();
                }
            }

            return(result);
        }
        public async Task <NotificationMessageSearchResult> SearchMessageAsync(NotificationMessageSearchCriteria criteria)
        {
            var result = new NotificationMessageSearchResult();

            using (var repository = _repositoryFactory())
            {
                result.Results = new List <NotificationMessage>();

                var query = repository.NotifcationMessages;

                if (!criteria.ObjectIds.IsNullOrEmpty())
                {
                    query = query.Where(n => criteria.ObjectIds.Contains(n.TenantId));
                }

                if (!string.IsNullOrEmpty(criteria.ObjectType))
                {
                    query = query.Where(n => n.TenantType == criteria.ObjectType);
                }

                if (!criteria.ObjectTypes.IsNullOrEmpty())
                {
                    query = query.Where(n => criteria.ObjectTypes.Contains(n.TenantType));
                }

                result.TotalCount = await query.CountAsync();

                if (criteria.Take > 0)
                {
                    var sortInfos = criteria.SortInfos;
                    if (sortInfos.IsNullOrEmpty())
                    {
                        sortInfos = new[] { new SortInfo {
                                                SortColumn = "CreatedDate", SortDirection = SortDirection.Descending
                                            } };
                    }
                    query = query.OrderBySortInfos(sortInfos).ThenBy(x => x.Id);

                    result.Results = query.Skip(criteria.Skip)
                                     .Take(criteria.Take)
                                     .ToArray()
                                     .Select(nm => nm.ToModel(AbstractTypeFactory <NotificationMessage> .TryCreateInstance()))
                                     .ToList();
                }
            }

            return(result);
        }