diff --git a/src/AutoFilterer/Attributes/ArraySearchFilterAttribute.cs b/src/AutoFilterer/Attributes/ArraySearchFilterAttribute.cs index b8adc4b..52ac321 100644 --- a/src/AutoFilterer/Attributes/ArraySearchFilterAttribute.cs +++ b/src/AutoFilterer/Attributes/ArraySearchFilterAttribute.cs @@ -1,4 +1,5 @@ -using System.Collections; +using AutoFilterer.Extensions; +using System.Collections; using System.Linq; using System.Linq.Expressions; using System.Reflection; @@ -14,8 +15,8 @@ public override Expression BuildExpression(ExpressionBuildContext context) return Expression.Constant(true); // TODO: Make it better. Maybe return null? When null, it should be ignored and combined with another expressions. } - var type = context.TargetProperty.PropertyType; - var prop = Expression.Property(context.ExpressionBody, context.TargetProperty.Name); + var type = context.TargetProperty.PropertyType.AsNonNullable(); + var prop = Expression.Property(context.ExpressionBody, context.TargetProperty.Name).GetValueExpressionIfNullable(); var containsMethod = typeof(Enumerable).GetMethods().FirstOrDefault(x => x.Name == nameof(Enumerable.Contains)).MakeGenericMethod(type); @@ -23,8 +24,8 @@ public override Expression BuildExpression(ExpressionBuildContext context) method: containsMethod, arguments: new Expression[] { - Expression.Property(Expression.Constant(context.FilterObject), context.FilterProperty), - Expression.Property(context.ExpressionBody, context.TargetProperty) + Expression.Property(Expression.Constant(context.FilterObject), context.FilterProperty).GetValueExpressionIfNullable(), + Expression.Property(context.ExpressionBody, context.TargetProperty).GetValueExpressionIfNullable() }); return containsExpression; diff --git a/tests/AutoFilterer.Tests/Attributes/ArraySearchAttributeTests.cs b/tests/AutoFilterer.Tests/Attributes/ArraySearchAttributeTests.cs index 569fdb8..3324e30 100644 --- a/tests/AutoFilterer.Tests/Attributes/ArraySearchAttributeTests.cs +++ b/tests/AutoFilterer.Tests/Attributes/ArraySearchAttributeTests.cs @@ -57,6 +57,27 @@ public void BuildExpression_ShouldGenerateQueryCorrect_WithAttribute(List data) + { + // Arrange + var queryable = data.AsQueryable(); + var filter = new PreferencesFilter_ArraySearchWithoutAttribute_Guid + { + OrganizationUnitId = data.Take(3).Select(x => x.OrganizationUnitId.GetValueOrDefault()).ToArray() + }; + + // Act + var expectedResult = queryable.Where(x => filter.OrganizationUnitId.Contains(x.OrganizationUnitId.GetValueOrDefault())); + var actualResult = queryable.ApplyFilter(filter); + + // Assert + Assert.Equal(expectedResult.Count(), actualResult.Count()); + + foreach (var expected in expectedResult) + Assert.True(actualResult.Contains(expected)); + } + private static IEnumerable Repeat(Func func, int times = 3) { for (int i = 0; i < times; i++) diff --git a/tests/AutoFilterer.Tests/Environment/Dtos/PreferencesFilter_ArraySearchWithoutAttribute_Guid.cs b/tests/AutoFilterer.Tests/Environment/Dtos/PreferencesFilter_ArraySearchWithoutAttribute_Guid.cs new file mode 100644 index 0000000..f32bc82 --- /dev/null +++ b/tests/AutoFilterer.Tests/Environment/Dtos/PreferencesFilter_ArraySearchWithoutAttribute_Guid.cs @@ -0,0 +1,10 @@ +using AutoFilterer.Attributes; +using AutoFilterer.Types; +using System; + +namespace AutoFilterer.Tests.Environment.Dtos; + +public class PreferencesFilter_ArraySearchWithoutAttribute_Guid : FilterBase +{ + public Guid[] OrganizationUnitId { get; set; } +} \ No newline at end of file diff --git a/tests/AutoFilterer.Tests/Environment/Models/Preferences.cs b/tests/AutoFilterer.Tests/Environment/Models/Preferences.cs index d9382bf..4a6bd50 100644 --- a/tests/AutoFilterer.Tests/Environment/Models/Preferences.cs +++ b/tests/AutoFilterer.Tests/Environment/Models/Preferences.cs @@ -1,4 +1,5 @@ -using System; +using AutoFilterer.Attributes; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -13,4 +14,7 @@ public class Preferences public string GivenName { get; set; } public int SecurityLevel { get; set; } public int? ReadLimit { get; set; } + + [ArraySearchFilter] + public Guid? OrganizationUnitId { get; set; } }