Compare commits
	
		
			2 Commits
		
	
	
		
			85f1d7c89f
			...
			cd0309a3d4
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| cd0309a3d4 | |||
| 0c12bdc899 | 
| @ -144,6 +144,20 @@ public class PagedRequestTests { | |||||||
|     Assert.Single(filtered); // Assuming only "John" starts with "Jo" |     Assert.Single(filtered); // Assuming only "John" starts with "Jo" | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |   [Fact] | ||||||
|  |   public void BuildFilterExpression_ShouldHandleEqualsAndContainsOperators() { | ||||||
|  |     var queryable = GetTestQueryable(); | ||||||
|  |     var request = new PagedRequest { | ||||||
|  |       Filters = "Age == \"31\" && (Name.Contains(\"Jo\"))" | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     var predicate = request.BuildFilterExpression<TestEntity>(); | ||||||
|  |     var filtered = queryable.Where(predicate).ToList(); | ||||||
|  | 
 | ||||||
|  |     Assert.Contains(filtered, t => t.Name.StartsWith("Jo")); | ||||||
|  |     Assert.Single(filtered); // Assuming only "John" starts with "Jo" | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|   [Fact] |   [Fact] | ||||||
|   public void BuildFilterExpression_ShouldHandleEndsWithOperator() { |   public void BuildFilterExpression_ShouldHandleEndsWithOperator() { | ||||||
|     var queryable = GetTestQueryable(); |     var queryable = GetTestQueryable(); | ||||||
|  | |||||||
| @ -8,7 +8,7 @@ | |||||||
| 
 | 
 | ||||||
|     <!-- NuGet package metadata --> |     <!-- NuGet package metadata --> | ||||||
|     <PackageId>MaksIT.Core</PackageId> |     <PackageId>MaksIT.Core</PackageId> | ||||||
|     <Version>1.3.1</Version> |     <Version>1.3.3</Version> | ||||||
|     <Authors>Maksym Sadovnychyy</Authors> |     <Authors>Maksym Sadovnychyy</Authors> | ||||||
|     <Company>MAKS-IT</Company> |     <Company>MAKS-IT</Company> | ||||||
|     <Product>MaksIT.Core</Product> |     <Product>MaksIT.Core</Product> | ||||||
|  | |||||||
| @ -15,16 +15,35 @@ public class PagedRequest : RequestModelBase { | |||||||
|     if (string.IsNullOrWhiteSpace(Filters)) |     if (string.IsNullOrWhiteSpace(Filters)) | ||||||
|       return x => true; // Returns an expression that doesn't filter anything. |       return x => true; // Returns an expression that doesn't filter anything. | ||||||
| 
 | 
 | ||||||
|     // Adjust Filters to make Contains, StartsWith, EndsWith, ==, and != case-insensitive |     // Get the type of T | ||||||
|     string adjustedFilters = Filters |     var type = typeof(T); | ||||||
|         .Replace(".Contains(", ".ToLower().Contains(") |  | ||||||
|         .Replace(".StartsWith(", ".ToLower().StartsWith(") |  | ||||||
|         .Replace(".EndsWith(", ".ToLower().EndsWith(") |  | ||||||
|         .Replace("==", ".ToLower() ==") |  | ||||||
|         .Replace("!=", ".ToLower() !="); |  | ||||||
| 
 | 
 | ||||||
|     // Ensure values are also transformed to lowercase |     // Adjust Filters to make Contains, StartsWith, EndsWith, ==, and != case-insensitive | ||||||
|     adjustedFilters = Regex.Replace(adjustedFilters, "\"([^\"]+)\"", m => $"\"{m.Groups[1].Value.ToLower()}\""); |     string adjustedFilters = Filters; | ||||||
|  | 
 | ||||||
|  |     // Regex to find property names and methods | ||||||
|  |     adjustedFilters = Regex.Replace(adjustedFilters, @"(\w+)\.(Contains|StartsWith|EndsWith)\(\""(.*?)\""\)", m => { | ||||||
|  |       var propertyName = m.Groups[1].Value; | ||||||
|  |       var method = m.Groups[2].Value; | ||||||
|  |       var value = m.Groups[3].Value; | ||||||
|  |       var property = type.GetProperty(propertyName); | ||||||
|  |       if (property != null && property.PropertyType == typeof(string)) { | ||||||
|  |         return $"{propertyName}.ToLower().{method}(\"{value.ToLower()}\")"; | ||||||
|  |       } | ||||||
|  |       return m.Value; | ||||||
|  |     }); | ||||||
|  | 
 | ||||||
|  |     // Regex to find equality and inequality comparisons | ||||||
|  |     adjustedFilters = Regex.Replace(adjustedFilters, @"(\w+)\s*(==|!=)\s*\""(.*?)\""", m => { | ||||||
|  |       var propertyName = m.Groups[1].Value; | ||||||
|  |       var comparison = m.Groups[2].Value; | ||||||
|  |       var value = m.Groups[3].Value; | ||||||
|  |       var property = type.GetProperty(propertyName); | ||||||
|  |       if (property != null && property.PropertyType == typeof(string)) { | ||||||
|  |         return $"{propertyName}.ToLower() {comparison} \"{value.ToLower()}\""; | ||||||
|  |       } | ||||||
|  |       return m.Value; | ||||||
|  |     }); | ||||||
| 
 | 
 | ||||||
|     // Parse the adjusted filter string into a dynamic lambda expression |     // Parse the adjusted filter string into a dynamic lambda expression | ||||||
|     var predicate = DynamicExpressionParser.ParseLambda<T, bool>( |     var predicate = DynamicExpressionParser.ParseLambda<T, bool>( | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user