diff --git a/src/Core.Persistence/Core.Persistence.csproj b/src/Core.Persistence/Core.Persistence.csproj index 56c42e3..4361ba5 100644 --- a/src/Core.Persistence/Core.Persistence.csproj +++ b/src/Core.Persistence/Core.Persistence.csproj @@ -6,7 +6,7 @@ NArchitecture.$(AssemblyName) True NArchitecture.$(AssemblyName) - 1.1.4 + 1.1.5 NArchitecture $(AssemblyName) Provides persistence utilities for data access using Entity Framework Core. NArchitecture diff --git a/src/Core.Persistence/Dynamic/IQueryableDynamicFilterExtensions.cs b/src/Core.Persistence/Dynamic/IQueryableDynamicFilterExtensions.cs index 94a531a..24f2fad 100644 --- a/src/Core.Persistence/Dynamic/IQueryableDynamicFilterExtensions.cs +++ b/src/Core.Persistence/Dynamic/IQueryableDynamicFilterExtensions.cs @@ -28,6 +28,8 @@ public static class IQueryableDynamicFilterExtensions public static IQueryable ToDynamic(this IQueryable query, DynamicQuery dynamicQuery) { + // Test + Console.WriteLine(dynamicQuery.Filter.Value); if (dynamicQuery.Filter is not null) query = Filter(query, dynamicQuery.Filter); if (dynamicQuery.Sort is not null && dynamicQuery.Sort.Any()) @@ -38,10 +40,33 @@ public static IQueryable ToDynamic(this IQueryable query, DynamicQuery private static IQueryable Filter(IQueryable queryable, Filter filter) { IList filters = GetAllFilters(filter); - string?[] values = filters.Select(f => f.Value).ToArray(); + var values = new List(); + foreach (var f in filters) + { + if (f.Operator == "in") + { + Console.WriteLine(f.Value); + var inValues = f.Value.Split(',').Select(v => v.Trim()); + values.AddRange(inValues); + } + else if (f.Operator == "between") + { + var betweenValues = f.Value.Split(','); + if (betweenValues.Length != 2) + throw new ArgumentException("Invalid Value for 'between' operator"); + + values.AddRange(betweenValues.Select(v => v.Trim())); + } + else + { + values.Add(f.Value); + } + } + string where = Transform(filter, filters); + Console.WriteLine(where); if (!string.IsNullOrEmpty(where) && values != null) - queryable = queryable.Where(where, values); + queryable = queryable.Where(where, values.ToArray()); return queryable; } @@ -107,7 +132,19 @@ public static string Transform(Filter filter, IList filters) } else if (filter.Operator == "in") { - where.Append($"np({filter.Field}) in ({filter.Value})"); + var valueCount = filter.Value.Split(',').Length; + var paramIndexes = Enumerable.Range(index, valueCount) + .Select(i => $"@{i}") + .ToArray(); + + if (!filter.CaseSensitive) + { + where.Append($"np({filter.Field}).ToLower() in ({string.Join(",", paramIndexes)})"); + } + else + { + where.Append($"np({filter.Field}) in ({string.Join(",", paramIndexes)})"); + } } else if (filter.Operator == "between") { @@ -115,7 +152,10 @@ public static string Transform(Filter filter, IList filters) if (values.Length != 2) throw new ArgumentException("Invalid Value for 'between' operator"); - where.Append($"(np({filter.Field}) >= {values[0]} and np({filter.Field}) <= {values[1]})"); + var lowerBound = $"@{index++}"; + var upperBound = $"@{index++}"; + + where.Append($"(np({filter.Field}) >= {lowerBound} and np({filter.Field}) <= {upperBound})"); } else where.Append($"np({filter.Field}) {comparison} @{index.ToString()}");