如何使用 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 并计划大量使用此类过滤,请使用此方法。否则客户端方法应该适合你。