如何使用 RestSharp 过滤空值?
how to filter null values with RestSharp?
我用 RestSharp 做了一个请求:
var request = new RestRequest("api/timerecord", Method.GET);
var response = client.Execute<List<TimeRecordDTO>>(request);
TimeRecords 包含一个 属性 SettledOn。这具有日期时间值或空值:
...,"SettledOn":null,...
或
...,"SettledOn":"2018-01-02T18:26:01",...
现在我尝试过滤这个 属性。我只想要 TimeRecords,其中 SettledOn 为空。
我试过了
var request = new RestRequest("api/timerecord", Method.GET);
request.AddParameter("SettledOn", null);
var response = client.Execute<List<TimeRecordDTO>>(request);
但我仍然得到所有时间记录。
我需要做什么来过滤实体?
你混淆了这里的概念。 RestSharp 只是一个 HTTP 客户端库。如果您的 API 方法 return 包含所有 TimeRecords 实体,HTTP 响应将包含所有实体,并且 RestSharp 将在您调用 client.Execute<List<TimeRecordDTO>>(request);
时反序列化整个列表。
在您 API 分析此请求参数并在服务器端执行实际过滤之前,向请求添加参数 SettledOn
不会产生任何影响。
因此您有两个选项来过滤值:
客户端解决方案:
只需使用简单的 LINQ 过滤实体:
var request = new RestRequest("api/timerecord", Method.GET);
var response = client.Execute<List<TimeRecordDTO>>(request);
var filtered = response.Data.Where(x => x.SettledOn == null);
服务器端解决方案:
您应该调整您的 API 方法实现来分析请求参数。如果您需要将可能性添加到 return 只有 SettledOn
设置为 null
的实体,您可以请求参数 settledOnNullOnly
:
public IEnumerable<TimeRecordDTO> Get(bool settledOnNullOnly)
{
// Pass settledOnNullOnly to DB query or filter entities with LINQ
// ...
}
现在,当您将 settledOnNullOnly
设置为 true
时,您将仅收到过滤后的实体。
var request = new RestRequest("api/values", Method.GET);
request.AddParameter("settledOnNullOnly", "true");
var response = client.Execute<List<TimeRecordDTO>>(request);
从性能角度来看,服务器端解决方案更好,因为您不会获取和传输不必要的数据。如果您有可能调整 API 并计划大量使用此类过滤,请使用此方法。否则客户端方法应该适合你。
我用 RestSharp 做了一个请求:
var request = new RestRequest("api/timerecord", Method.GET);
var response = client.Execute<List<TimeRecordDTO>>(request);
TimeRecords 包含一个 属性 SettledOn。这具有日期时间值或空值:
...,"SettledOn":null,...
或
...,"SettledOn":"2018-01-02T18:26:01",...
现在我尝试过滤这个 属性。我只想要 TimeRecords,其中 SettledOn 为空。
我试过了
var request = new RestRequest("api/timerecord", Method.GET);
request.AddParameter("SettledOn", null);
var response = client.Execute<List<TimeRecordDTO>>(request);
但我仍然得到所有时间记录。
我需要做什么来过滤实体?
你混淆了这里的概念。 RestSharp 只是一个 HTTP 客户端库。如果您的 API 方法 return 包含所有 TimeRecords 实体,HTTP 响应将包含所有实体,并且 RestSharp 将在您调用 client.Execute<List<TimeRecordDTO>>(request);
时反序列化整个列表。
在您 API 分析此请求参数并在服务器端执行实际过滤之前,向请求添加参数 SettledOn
不会产生任何影响。
因此您有两个选项来过滤值:
客户端解决方案:
只需使用简单的 LINQ 过滤实体:
var request = new RestRequest("api/timerecord", Method.GET);
var response = client.Execute<List<TimeRecordDTO>>(request);
var filtered = response.Data.Where(x => x.SettledOn == null);
服务器端解决方案:
您应该调整您的 API 方法实现来分析请求参数。如果您需要将可能性添加到 return 只有 SettledOn
设置为 null
的实体,您可以请求参数 settledOnNullOnly
:
public IEnumerable<TimeRecordDTO> Get(bool settledOnNullOnly)
{
// Pass settledOnNullOnly to DB query or filter entities with LINQ
// ...
}
现在,当您将 settledOnNullOnly
设置为 true
时,您将仅收到过滤后的实体。
var request = new RestRequest("api/values", Method.GET);
request.AddParameter("settledOnNullOnly", "true");
var response = client.Execute<List<TimeRecordDTO>>(request);
从性能角度来看,服务器端解决方案更好,因为您不会获取和传输不必要的数据。如果您有可能调整 API 并计划大量使用此类过滤,请使用此方法。否则客户端方法应该适合你。