Example #1
0
        public async Task <SearchResult <ClassifierLink> > Handle(GetClassifierLinkList request, CancellationToken cancellationToken)
        {
            if (request == null)
            {
                throw new ArgumentNullException(nameof(request));
            }

            var type = await _classifierTypeService.Get(request.TypeCode, cancellationToken);

            if (type.HierarchyType != HierarchyType.Groups)
            {
                throw new InvalidOperationException("Invalid classifier hierarchy type for groups operations.");
            }

            using (var db = _dbContextFactory.Create())
            {
                IQueryable <DbClassifierLink> query = db.GetTable <DbClassifierLink>();

                if (request.GroupUid.HasValue)
                {
                    query = query.Where(x => x.GroupUid == request.GroupUid);
                }

                if (request.ItemUid.HasValue)
                {
                    query = query.Where(x => x.ItemUid == request.ItemUid);
                }

                var joined = from link in query
                             join @group in db.GetTable <DbClassifierGroup>() on link.GroupUid equals @group.Uid
                             join tree in db.GetTable <DbClassifierTree>() on @group.TreeUid equals tree.Uid
                             join item in db.GetTable <DbClassifier>() on link.ItemUid equals item.Uid
                             select new { Tree = tree, Group = @group, Item = item };

                // todo: order by default hierarchy first, then by group name
                // todo: fix QueryableExtensions.GetMemberName and write tests
                request.SortColumn = "Group.Name";
                var data = await joined
                           .Apply(request, x => x.Group.Name)
                           .Select(x => new ClassifierLink
                {
                    Tree = new ClassifierTree
                    {
                        Uid  = x.Tree.Uid,
                        Code = x.Tree.Code,
                        Name = x.Tree.Name
                    },
                    Group = new ClassifierGroup
                    {
                        Uid  = x.Group.Uid,
                        Code = x.Group.Code,
                        Name = x.Group.Name
                    },
                    Item = new Classifier
                    {
                        Type = type.Code,
                        Uid  = x.Item.Uid,
                        Code = x.Item.Code,
                        Name = x.Item.Name
                    }
                })
                           .ToListAsync(cancellationToken);

                return(new SearchResult <ClassifierLink>
                {
                    TotalCount = query.GetTotalCount(request),
                    Rows = data
                });
            }
        }
Example #2
0
 public async Task <SearchResult <ClassifierLink> > List(GetClassifierLinkList request)
 {
     return(await _mediator.Send(request));
 }