Ejemplo n.º 1
0
        /// <summary>
        /// Get autocomplete list
        /// </summary>
        /// <typeparam name="TEntity"></typeparam>
        /// <typeparam name="TPrimaryKey"></typeparam>
        /// <param name="term"></param>
        /// <param name="allowInherited"></param>
        /// <param name="selectedValue"></param>
        /// <param name="filter"></param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        public async Task <List <AutocompleteItemDto> > GetList <TEntity, TPrimaryKey>(string term, bool allowInherited, Guid?selectedValue, string filter, CancellationToken cancellationToken) where TEntity : class, IEntity <TPrimaryKey>
        {
            var sessionFactory = _iocResolver.Resolve <ISessionFactory>();
            var session        = sessionFactory.GetCurrentSession();

            var entityConfig    = _configurationStore.Get(typeof(TEntity));
            var displayProperty = entityConfig.DisplayNamePropertyInfo.Name;

            var termLength = (term ?? "").Length;

            var hql = $"select Id, {displayProperty} as Name, length({displayProperty}) - {termLength} as Ranking from {typeof(TEntity).FullName} ent ";

            var filterCriteria = new FilterCriteria(FilterCriteria.FilterMethod.Hql);

            AppendFilterCriteria <TEntity>(filterCriteria, filter);

            if (!string.IsNullOrWhiteSpace(term))
            {
                filterCriteria.AddParameterisedCriterion($"lower(ent.{displayProperty}) like {{0}}", $"%{term.ToLower()}%");
            }

            if (!string.IsNullOrWhiteSpace(entityConfig.DiscriminatorValue) && !allowInherited)
            {
                filterCriteria.AddParameterisedCriterion($"ent.class={{0}}", entityConfig.DiscriminatorValue.Trim('\''));
            }

            var sb = new StringBuilder();

            if (filterCriteria.FilterClauses.Any())
            {
                foreach (var filterClause in filterCriteria.FilterClauses)
                {
                    if (sb.Length > 0)
                    {
                        sb.Append(" and ");
                    }

                    sb.Append("(");
                    sb.Append(filterClause);
                    sb.Append(")");
                }
            }

            if (selectedValue != null)
            {
                if (sb.Length > 0)
                {
                    sb.Append(" or ");
                }

                sb.Append(" ent.Id = :id");
            }

            if (sb.Length > 0)
            {
                hql += " where " + sb.ToString();
            }

            hql += " order by Ranking, Name";

            var q = session.CreateQuery(hql);

            q.SetMaxResults(10);

            // transfer parameters
            Shesha.NHibernate.Session.SessionExtensions.TransferHqlParameters(q, filterCriteria);

            if (selectedValue != null)
            {
                q.SetParameter("id", selectedValue);
            }

            var data = await q.ListAsync <object[]>(cancellationToken);

            return(data.Where(i => i[1] != null).Select(i => new AutocompleteItemDto
            {
                Value = i[0].ToString(),
                DisplayText = i[1].ToString()
            }).ToList());
        }