Skip to content

Commit e62c7cb

Browse files
authored
Merge pull request #94 from fyzact/feature/add-notnullcheck-for-nested-objects
add not null check for nested object
2 parents 5f9db59 + 1df4737 commit e62c7cb

File tree

2 files changed

+67
-2
lines changed

2 files changed

+67
-2
lines changed

Castle.DynamicLinqQueryBuilder.Tests/Rules/Tests.cs

Lines changed: 61 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,17 @@ public class ExpressionTreeBuilderTestClass
3838
public List<double> DoubleList { get; set; }
3939
public List<string> StrList { get; set; }
4040
public List<ChildClass> ChildClasses { get; set; }
41+
public List<ChildClass> NestedNullObjectChildClasses { get; set; }
4142

4243
}
4344

4445
public class ChildClass
46+
{
47+
public string ClassName { get; set; }
48+
public ChildSubClass ChildSubClass { get; set; }
49+
}
50+
51+
public class ChildSubClass
4552
{
4653
public string ClassName { get; set; }
4754
}
@@ -100,7 +107,17 @@ public static List<ExpressionTreeBuilderTestClass> GetExpressionTreeData()
100107
StrList = new List<string>() { "Str1", "Str2" },
101108
DateList = new List<DateTime>() { DateTime.UtcNow.Date, DateTime.UtcNow.Date.AddDays(-2) },
102109
DoubleList = new List<double>() { 1.48, 1.84, 1.33 },
103-
IntNullList = new List<int?>() { 3, 4, 5, null }
110+
IntNullList = new List<int?>() { 3, 4, 5, null },
111+
NestedNullObjectChildClasses = new List<ChildClass>()
112+
{
113+
new ChildClass()
114+
{
115+
ChildSubClass = new ChildSubClass()
116+
{
117+
ClassName = "ChildSubClass"
118+
}
119+
}
120+
}
104121
};
105122
tData.Add(entry1);
106123

@@ -124,7 +141,21 @@ public static List<ExpressionTreeBuilderTestClass> GetExpressionTreeData()
124141
StrList = new List<string>() { "Str1", "Str2" },
125142
DateList = new List<DateTime>() { DateTime.UtcNow.Date, DateTime.UtcNow.Date.AddDays(-2) },
126143
DoubleList = new List<double>() { 1.48, 1.84, 1.33 },
127-
IntNullList = new List<int?>() { 3, 4, 5, null }
144+
IntNullList = new List<int?>() { 3, 4, 5, null },
145+
NestedNullObjectChildClasses = new List<ChildClass>()
146+
{
147+
new ChildClass()
148+
{
149+
150+
},
151+
new ChildClass()
152+
{
153+
ChildSubClass = new ChildSubClass()
154+
{
155+
ClassName = "className"
156+
}
157+
}
158+
}
128159
};
129160
tData.Add(entry2);
130161

@@ -332,6 +363,34 @@ public void IsNullSubCollection()
332363
Assert.IsTrue(contentNullFilteredList.Count == 0);
333364
}
334365

366+
[Test]
367+
public void IsNullNestedClassInSubCollection()
368+
{
369+
var startingQuery = GetExpressionTreeData().AsQueryable();
370+
371+
372+
//expect no entries to match
373+
var contentNullFilter = new QueryBuilderFilterRule
374+
{
375+
Condition = "and",
376+
Rules = new List<QueryBuilderFilterRule>
377+
{
378+
new QueryBuilderFilterRule
379+
{
380+
Condition = "and",
381+
Field = "NestedNullObjectChildClasses.ChildSubClass.ClassName",
382+
Id = "NestedNullObjectChildClasses.ChildSubClass.ClassName",
383+
Input = "NA",
384+
Operator = "equal",
385+
Type = "string",
386+
Value = new[] { "books" }
387+
}
388+
}
389+
};
390+
var contentNullFilteredList = startingQuery.BuildQuery<ExpressionTreeBuilderTestClass>(contentNullFilter).ToList();
391+
Assert.IsTrue(contentNullFilteredList != null);
392+
Assert.IsTrue(contentNullFilteredList.Count == 0);
393+
}
335394

336395
[Test]
337396
public void InClause()

Castle.DynamicLinqQueryBuilder/QueryBuilder.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,12 @@ private static Expression BuildNestedExpression(Expression expression, IEnumerat
308308
predicate
309309
));
310310
}
311+
else if (!expression.Type.IsValueType && propertyType != typeof(string))
312+
{
313+
var notnull = IsNotNull(expression);
314+
Expression body = BuildNestedExpression(expression, propertyCollectionEnumerator, rule, options, type);
315+
return Expression.AndAlso(notnull, body);
316+
}
311317
}
312318

313319
return BuildOperatorExpression(expression, rule, options, type);

0 commit comments

Comments
 (0)