Skip to content

Commit 43e2bfe

Browse files
authored
Merge pull request #287 from milosloub/master
Add Negative filter
2 parents 89662a8 + 91a5699 commit 43e2bfe

File tree

3 files changed

+33
-2
lines changed

3 files changed

+33
-2
lines changed

src/JsonApiDotNetCore/Extensions/IQueryableExtensions.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,10 @@ private static Expression GetFilterExpressionLambda(Expression left, Expression
195195
case FilterOperations.like:
196196
body = Expression.Call(left, "Contains", null, right);
197197
break;
198+
// {model.Id != 1}
199+
case FilterOperations.ne:
200+
body = Expression.NotEqual(left, right);
201+
break;
198202
default:
199203
throw new JsonApiException(500, $"Unknown filter operation {operation}");
200204
}

src/JsonApiDotNetCore/Internal/Query/FilterOperations.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ public enum FilterOperations
88
gt = 2,
99
le = 3,
1010
ge = 4,
11-
like = 5
11+
like = 5,
12+
ne = 6
1213
}
13-
}
14+
}

test/JsonApiDotNetCoreExampleTests/Acceptance/Spec/AttributeFilterTests.cs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,5 +105,31 @@ public async Task Cannot_Filter_If_Explicitly_Forbidden()
105105
// assert
106106
Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode);
107107
}
108+
109+
[Fact]
110+
public async Task Can_Filter_On_Not_Equal_Values()
111+
{
112+
// arrange
113+
var context = _fixture.GetService<AppDbContext>();
114+
var todoItem = _todoItemFaker.Generate();
115+
context.TodoItems.Add(todoItem);
116+
await context.SaveChangesAsync();
117+
118+
var totalCount = context.TodoItems.Count();
119+
var httpMethod = new HttpMethod("GET");
120+
var route = $"/api/v1/todo-items?page[size]={totalCount}&filter[ordinal]=ne:{todoItem.Ordinal}";
121+
var request = new HttpRequestMessage(httpMethod, route);
122+
123+
// act
124+
var response = await _fixture.Client.SendAsync(request);
125+
var body = await response.Content.ReadAsStringAsync();
126+
var deserializedTodoItems = _fixture
127+
.GetService<IJsonApiDeSerializer>()
128+
.DeserializeList<TodoItem>(body);
129+
130+
// assert
131+
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
132+
Assert.False(deserializedTodoItems.Any(i => i.Ordinal == todoItem.Ordinal));
133+
}
108134
}
109135
}

0 commit comments

Comments
 (0)