예제 #1
0
        /// <summary>
        /// Search members in database by given criteria
        /// </summary>
        /// <param name="criteria"></param>
        /// <returns></returns>
        public virtual MembersSearchResult SearchMembers(MembersSearchCriteria criteria)
        {
            var retVal = new MembersSearchResult();

            using (var repository = RepositoryFactory())
            {
                var query = LinqKit.Extensions.AsExpandable(repository.Members);

                if (!criteria.MemberTypes.IsNullOrEmpty())
                {
                    query = query.Where(x => criteria.MemberTypes.Contains(x.MemberType) || x.MemberType == null);
                }

                if (criteria.MemberId != null)
                {
                    //TODO: DeepSearch in specified member
                    query = query.Where(x => x.MemberRelations.Any(y => y.AncestorId == criteria.MemberId));
                }
                else
                {
                    if (!criteria.DeepSearch)
                    {
                        query = query.Where(x => !x.MemberRelations.Any());
                    }
                }
                //Get extra predicates (where clause)
                var predicate = GetQueryPredicate(criteria);

                query = query.Where(LinqKit.Extensions.Expand(predicate));

                var sortInfos = criteria.SortInfos;
                if (sortInfos.IsNullOrEmpty())
                {
                    sortInfos = new[] { new SortInfo {
                                            SortColumn = ReflectionUtility.GetPropertyName <Member>(x => x.MemberType), SortDirection = SortDirection.Descending
                                        } };
                }
                query = query.OrderBySortInfos(sortInfos);

                retVal.TotalCount = query.Count();

                retVal.Members = query.Skip(criteria.Skip).Take(criteria.Take).ToArray()
                                 .Select(x => x.ToMember(MemberFactory.TryCreateMember(x.MemberType))).ToList();
                return(retVal);
            }
        }
예제 #2
0
        /// <summary>
        /// Return members by requested ids can be override for load extra data for resulting members
        /// </summary>
        /// <param name="memberIds"></param>
        /// <param name="memberTypes"></param>
        /// <returns></returns>
        public virtual Member[] GetByIds(string[] memberIds, string[] memberTypes = null)
        {
            var retVal = new List <Member>();

            using (var repository = RepositoryFactory())
            {
                var dataMembers = repository.GetMembersByIds(memberIds, memberTypes);
                foreach (var dataMember in dataMembers)
                {
                    var member = MemberFactory.TryCreateMember(dataMember.MemberType);
                    if (member != null)
                    {
                        dataMember.ToMember(member);
                        retVal.Add(member);
                    }
                }
            }
            foreach (var member in retVal)
            {
                //Load dynamic properties for member
                DynamicPropertyService.LoadDynamicPropertyValues(member);
            }
            return(retVal.ToArray());
        }