/// <summary>
        /// Search a Queryable collection
        /// </summary>
        /// <typeparam name="T">Type of object to be searched</typeparam>
        /// <param name="source"></param>
        /// <param name="stringProperties">
        /// String properties to search. If ommitted, a search
        /// on all string properties will be performed
        /// </param>
        public static QueryableStringSearch <T> Search <T>(this IQueryable <T> source, params Expression <Func <T, string> >[] stringProperties)
        {
            if (stringProperties == null || stringProperties.All(sp => sp == null))
            {
                stringProperties = EnumerableExpressionHelper.GetProperties <T, string>();
            }

            return(new QueryableStringSearch <T>(source, stringProperties));
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Define the term with which to compare string properties to
        /// </summary>
        /// <param name="terms">The terms to perform the Levenshtein distance against</param>
        /// <returns></returns>
        public IEnumerable <ILevenshteinDistance <T> > ComparedTo(params string[] terms)
        {
            var levenshteinDistanceExpression = EnumerableExpressionHelper.CalculateLevenshteinDistances(Properties, terms);

            var buildExpression  = EnumerableExpressionHelper.ConstructLevenshteinResult <T>(levenshteinDistanceExpression, FirstParameter);
            var selectExpression = Expression.Lambda <Func <T, LevenshteinDistance <T> > >(buildExpression, FirstParameter).Compile();
            var convertedSource  = Source.Select(selectExpression.Invoke);

            return(new EnumerableLevenshteinCompare <ILevenshteinDistance <T> >(convertedSource));
        }
        /// <summary>
        /// Define the term with which to compare string properties to
        /// </summary>
        /// <param name="stringProperty">The property to perform the Levenshtein distance against</param>
        /// <returns></returns>
        public IEnumerable <ILevenshteinDistance <T> > ComparedTo(Expression <Func <T, string> > stringProperty)
        {
            var sourceProperty = this.Properties[0];
            var targetProperty = this.AlignParameter(stringProperty);

            var levenshteinDistanceExpression = EnumerableExpressionHelper.CalculateLevenshteinDistance(sourceProperty, targetProperty);
            var buildExpression  = EnumerableExpressionHelper.ConstructLevenshteinResult <T>(levenshteinDistanceExpression, this.FirstParameter);
            var selectExpression = Expression.Lambda <Func <T, LevenshteinDistance <T> > >(buildExpression, this.FirstParameter).Compile();
            var convertedSource  = this.Source.Select(selectExpression.Invoke);

            return(new EnumerableLevenshteinCompare <ILevenshteinDistance <T> >(convertedSource));
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Rank the filtered items based on the matched occurences
        /// </summary>
        /// <returns>
        /// Queryable ranked items.  Each item will contain
        /// the amount of hits found across the defined properties.
        /// </returns>
        /// <remarks>Only works in conjunction with string searches</remarks>
        public IQueryable <IRanked <T> > ToRanked()
        {
            Expression combinedHitExpression = null;

            foreach (var propertyToSearch in Properties)
            {
                var nullSafeExpression = BuildNullSafeExpression(propertyToSearch);
                for (int j = 0; j < _searchTerms.Count; j++)
                {
                    var searchTerm         = _searchTerms[j];
                    var hitCountExpression = EnumerableExpressionHelper.CalculateHitCount(nullSafeExpression, searchTerm);
                    combinedHitExpression = ExpressionHelper.AddExpressions(combinedHitExpression, hitCountExpression);
                }
            }

            var rankedInitExpression = EnumerableExpressionHelper.ConstructRankedResult <T>(combinedHitExpression, FirstParameter);
            var selectExpression     = Expression.Lambda <Func <T, Ranked <T> > >(rankedInitExpression, FirstParameter);

            return(this.Select(selectExpression));
        }
        /// <summary>
        /// Rank the filtered items based on the matched occurences
        /// </summary>
        /// <returns>
        /// Enumerable of ranked items.  Each item will contain
        /// the amount of hits found across the defined properties
        /// </returns>
        public IEnumerable <IRanked <T> > ToRanked()
        {
            Expression combinedHitExpression = null;

            foreach (var propertyToSearch in this.Properties)
            {
                for (int j = 0; j < this._containingSearchTerms.Count; j++)
                {
                    var searchTerm         = this._containingSearchTerms[j];
                    var nullSafeExpresion  = this.BuildNullSafeExpresion(propertyToSearch);
                    var hitCountExpression = EnumerableExpressionHelper.CalculateHitCount(nullSafeExpresion, searchTerm, _searchOptions);
                    combinedHitExpression = ExpressionHelper.AddExpressions(combinedHitExpression, hitCountExpression);
                }
            }

            var rankedInitExpression = EnumerableExpressionHelper.ConstructRankedResult <T>(combinedHitExpression, this.FirstParameter);
            var selectExpression     = Expression.Lambda <Func <T, Ranked <T> > >(rankedInitExpression, this.FirstParameter).Compile();

            return(this.Select(selectExpression.Invoke));
        }
Ejemplo n.º 6
0
        /// <summary>
        /// Rank the filtered items based on the matched occurences
        /// </summary>
        /// <returns>
        /// Enumerable of ranked items.  Each item will contain
        /// the amount of hits found across the defined properties
        /// </returns>
        public IEnumerable <IRanked <T> > ToRanked(RankedType type = RankedType.Default)
        {
            Expression combinedHitExpression = null;

            foreach (var propertyToSearch in Properties)
            {
                for (int j = 0; j < _searchTerms.Count; j++)
                {
                    var searchTerm         = _searchTerms[j];
                    var nullSafeExpresion  = BuildNullSafeExpresion(propertyToSearch);
                    var hitCountExpression = type == RankedType.Default ? EnumerableExpressionHelper.CalculateHitCount(nullSafeExpresion, searchTerm, _searchOptions)
                                                                        : EnumerableExpressionHelper.CalculateHitCount_LeftWeighted(nullSafeExpresion, searchTerm, _searchOptions);
                    combinedHitExpression = ExpressionHelper.AddExpressions(combinedHitExpression, hitCountExpression);
                }
            }

            var rankedInitExpression = EnumerableExpressionHelper.ConstructRankedResult <T>(combinedHitExpression, FirstParameter);
            var selectExpression     = Expression.Lambda <Func <T, Ranked <T> > >(rankedInitExpression, FirstParameter).Compile();

            return(this.Select(selectExpression.Invoke));
        }
Ejemplo n.º 7
0
 public InvitationMappings()
 {
     CreateMap <Invitation, InvitationDto>()
     .ForMember(d => d.State, opt => opt.MapFrom(EnumerableExpressionHelper.CreateEnumToStringExpression((Invitation d) => ((InvitationStatus)d.Status))))
     .ForMember(d => d.SentDate, opt => opt.MapFrom(s => s.CreatedDate));
 }
        /// <summary>
        /// Search a Queryable collection
        /// </summary>
        /// <typeparam name="T">Type of object to be searched</typeparam>
        public static QueryableStringSearch <T> Search <T>(this IQueryable <T> source)
        {
            var properties = EnumerableExpressionHelper.GetProperties <T, string>();

            return(new QueryableStringSearch <T>(source, properties));
        }