Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/Core.Persistence/Core.Persistence.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<RootNamespace>NArchitecture.$(AssemblyName)</RootNamespace>
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
<PackageId>NArchitecture.$(AssemblyName)</PackageId>
<Version>1.1.4</Version>
<Version>1.1.5</Version>
<Title>NArchitecture $(AssemblyName)</Title>
<Description>Provides persistence utilities for data access using Entity Framework Core.</Description>
<Product>NArchitecture</Product>
Expand Down
48 changes: 44 additions & 4 deletions src/Core.Persistence/Dynamic/IQueryableDynamicFilterExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@

public static IQueryable<T> ToDynamic<T>(this IQueryable<T> query, DynamicQuery dynamicQuery)
{
// Test
Console.WriteLine(dynamicQuery.Filter.Value);

Check warning on line 32 in src/Core.Persistence/Dynamic/IQueryableDynamicFilterExtensions.cs

View workflow job for this annotation

GitHub Actions / build

Dereference of a possibly null reference.

Check warning on line 32 in src/Core.Persistence/Dynamic/IQueryableDynamicFilterExtensions.cs

View workflow job for this annotation

GitHub Actions / build

Dereference of a possibly null reference.
if (dynamicQuery.Filter is not null)
query = Filter(query, dynamicQuery.Filter);
if (dynamicQuery.Sort is not null && dynamicQuery.Sort.Any())
Expand All @@ -38,10 +40,33 @@
private static IQueryable<T> Filter<T>(IQueryable<T> queryable, Filter filter)
{
IList<Filter> filters = GetAllFilters(filter);
string?[] values = filters.Select(f => f.Value).ToArray();
var values = new List<object>();
foreach (var f in filters)
{
if (f.Operator == "in")
{
Console.WriteLine(f.Value);
var inValues = f.Value.Split(',').Select(v => v.Trim());

Check warning on line 49 in src/Core.Persistence/Dynamic/IQueryableDynamicFilterExtensions.cs

View workflow job for this annotation

GitHub Actions / build

Dereference of a possibly null reference.

Check warning on line 49 in src/Core.Persistence/Dynamic/IQueryableDynamicFilterExtensions.cs

View workflow job for this annotation

GitHub Actions / build

Dereference of a possibly null reference.
values.AddRange(inValues);
}
else if (f.Operator == "between")
{
var betweenValues = f.Value.Split(',');

Check warning on line 54 in src/Core.Persistence/Dynamic/IQueryableDynamicFilterExtensions.cs

View workflow job for this annotation

GitHub Actions / build

Dereference of a possibly null reference.

Check warning on line 54 in src/Core.Persistence/Dynamic/IQueryableDynamicFilterExtensions.cs

View workflow job for this annotation

GitHub Actions / build

Dereference of a possibly null reference.
if (betweenValues.Length != 2)
throw new ArgumentException("Invalid Value for 'between' operator");

values.AddRange(betweenValues.Select(v => v.Trim()));
}
else
{
values.Add(f.Value);

Check warning on line 62 in src/Core.Persistence/Dynamic/IQueryableDynamicFilterExtensions.cs

View workflow job for this annotation

GitHub Actions / build

Possible null reference argument for parameter 'item' in 'void List<object>.Add(object item)'.

Check warning on line 62 in src/Core.Persistence/Dynamic/IQueryableDynamicFilterExtensions.cs

View workflow job for this annotation

GitHub Actions / build

Possible null reference argument for parameter 'item' in 'void List<object>.Add(object item)'.
}
}

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;
}
Expand Down Expand Up @@ -107,15 +132,30 @@
}
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")
{
var values = filter.Value.Split(',');
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()}");
Expand Down
Loading