Skip to content

Commit 705193a

Browse files
authored
Merge pull request #19 from kodlamaio-projects/feat/persistence/in&between
persistence(*): fix in and between problem
2 parents 9561d89 + 1720c8d commit 705193a

File tree

2 files changed

+45
-5
lines changed

2 files changed

+45
-5
lines changed

src/Core.Persistence/Core.Persistence.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<RootNamespace>NArchitecture.$(AssemblyName)</RootNamespace>
77
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
88
<PackageId>NArchitecture.$(AssemblyName)</PackageId>
9-
<Version>1.1.4</Version>
9+
<Version>1.1.5</Version>
1010
<Title>NArchitecture $(AssemblyName)</Title>
1111
<Description>Provides persistence utilities for data access using Entity Framework Core.</Description>
1212
<Product>NArchitecture</Product>

src/Core.Persistence/Dynamic/IQueryableDynamicFilterExtensions.cs

Lines changed: 44 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ public static class IQueryableDynamicFilterExtensions
2828

2929
public static IQueryable<T> ToDynamic<T>(this IQueryable<T> query, DynamicQuery dynamicQuery)
3030
{
31+
// Test
32+
Console.WriteLine(dynamicQuery.Filter.Value);
3133
if (dynamicQuery.Filter is not null)
3234
query = Filter(query, dynamicQuery.Filter);
3335
if (dynamicQuery.Sort is not null && dynamicQuery.Sort.Any())
@@ -38,10 +40,33 @@ public static IQueryable<T> ToDynamic<T>(this IQueryable<T> query, DynamicQuery
3840
private static IQueryable<T> Filter<T>(IQueryable<T> queryable, Filter filter)
3941
{
4042
IList<Filter> filters = GetAllFilters(filter);
41-
string?[] values = filters.Select(f => f.Value).ToArray();
43+
var values = new List<object>();
44+
foreach (var f in filters)
45+
{
46+
if (f.Operator == "in")
47+
{
48+
Console.WriteLine(f.Value);
49+
var inValues = f.Value.Split(',').Select(v => v.Trim());
50+
values.AddRange(inValues);
51+
}
52+
else if (f.Operator == "between")
53+
{
54+
var betweenValues = f.Value.Split(',');
55+
if (betweenValues.Length != 2)
56+
throw new ArgumentException("Invalid Value for 'between' operator");
57+
58+
values.AddRange(betweenValues.Select(v => v.Trim()));
59+
}
60+
else
61+
{
62+
values.Add(f.Value);
63+
}
64+
}
65+
4266
string where = Transform(filter, filters);
67+
Console.WriteLine(where);
4368
if (!string.IsNullOrEmpty(where) && values != null)
44-
queryable = queryable.Where(where, values);
69+
queryable = queryable.Where(where, values.ToArray());
4570

4671
return queryable;
4772
}
@@ -107,15 +132,30 @@ public static string Transform(Filter filter, IList<Filter> filters)
107132
}
108133
else if (filter.Operator == "in")
109134
{
110-
where.Append($"np({filter.Field}) in ({filter.Value})");
135+
var valueCount = filter.Value.Split(',').Length;
136+
var paramIndexes = Enumerable.Range(index, valueCount)
137+
.Select(i => $"@{i}")
138+
.ToArray();
139+
140+
if (!filter.CaseSensitive)
141+
{
142+
where.Append($"np({filter.Field}).ToLower() in ({string.Join(",", paramIndexes)})");
143+
}
144+
else
145+
{
146+
where.Append($"np({filter.Field}) in ({string.Join(",", paramIndexes)})");
147+
}
111148
}
112149
else if (filter.Operator == "between")
113150
{
114151
var values = filter.Value.Split(',');
115152
if (values.Length != 2)
116153
throw new ArgumentException("Invalid Value for 'between' operator");
117154

118-
where.Append($"(np({filter.Field}) >= {values[0]} and np({filter.Field}) <= {values[1]})");
155+
var lowerBound = $"@{index++}";
156+
var upperBound = $"@{index++}";
157+
158+
where.Append($"(np({filter.Field}) >= {lowerBound} and np({filter.Field}) <= {upperBound})");
119159
}
120160
else
121161
where.Append($"np({filter.Field}) {comparison} @{index.ToString()}");

0 commit comments

Comments
 (0)