如何在JSONAPI.NET Core中通过过滤参数筛选null值?
好问题!我来帮你梳理下JSONAPI.NET Core关于null值过滤的支持情况和实现方式:
JSONAPI.NET Core的Null值过滤支持与实现
首先明确:JSONAPI.NET Core的较新版本默认支持eq:null格式的null值过滤,如果你的项目使用的是较新的库版本,直接使用你设想的查询参数就能生效。如果旧版本不支持,也可以通过自定义逻辑扩展实现。
一、默认支持的直接使用方式
你尝试的?page[size]=100&filter[endDate]=eq:null完全符合JSON:API的过滤规范,在新版JSONAPI.NET Core中可以直接用来筛选endDate为null的数据。你只需要修改Java客户端的请求URL即可:
response = client .resource(CreateURLWithFilters(API_BASE_URL, "?page[size]=100&filter[endDate]=eq:null")) .accept("application/json") .type("application/vnd.api+json") .header(HttpHeaders.AUTHORIZATION, "Bearer " + token) .get(ClientResponse.class);
发送请求后,就能得到你期望的结果:
[{"attributes":{"endDate":null,"id":1,"priority":1,"message":"wrewr","propertyId":1,"roomId":null,"startDate":"2018-05-16T00:00:00","dateModifiedUtc":"2018-05-16T10:38:22.727"},"id":"1","type":"notices"}]
二、旧版本的自定义实现方案
如果你的库版本较旧,默认不支持eq:null的过滤逻辑,可以通过自定义过滤运算符来补全这个功能:
- 在后端服务配置中注册自定义处理器
services.AddJsonApi<AppDbContext>(options => { options.Filtering.AddDefaultOperators(); // 注册处理null相等的自定义运算符 options.Filtering.RegisterOperator("eq", new NullEqualityOperatorHandler()); });
- 实现自定义的过滤处理器类
public class NullEqualityOperatorHandler : IFilterOperatorHandler { public Expression Handle(FilterContext context) { var propertyExpr = context.PropertyExpression; var filterValue = context.Value?.ToString(); // 处理值为null的情况 if (string.Equals(filterValue, "null", StringComparison.OrdinalIgnoreCase)) { return Expression.Equal(propertyExpr, Expression.Constant(null, propertyExpr.Type)); } // 保留原有的普通相等逻辑 var convertedValue = Convert.ChangeType(filterValue, propertyExpr.Type); return Expression.Equal(propertyExpr, Expression.Constant(convertedValue)); } }
这个处理器会识别过滤参数中的null值,生成对应的EF查询表达式,从而筛选出数据库中该字段为null的记录。
内容的提问来源于stack exchange,提问作者spacecraft
相关产品推荐
相关产品推荐

