/// <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)); }
/// <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)); }
/// <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)); }
/// <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)); }
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)); }