如何使用RestSharp过滤空值?

时间:2018-01-03 07:46:33

标签: c# rest restsharp

我使用RestSharp做了一个请求:

var request = new RestRequest("api/timerecord", Method.GET);
var response = client.Execute<List<TimeRecordDTO>>(request);

TimeRecords包含Property SettledOn。它具有DateTime-Value或空值:

...,"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);

但我仍然得到所有TimeRecords。

我需要做些什么来过滤实体?

1 个答案:

答案 0 :(得分:0)

你在这里混淆了这些概念。 RestSharp只是一个HTTP客户端库。如果您的API方法返回所有TimeRecords实体,则HTTP响应将全部包含它们,并且当您调用client.Execute<List<TimeRecordDTO>>(request);时,RestSharp将反序列化整个列表。 在您的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方法实现以分析请求参数。如果您需要添加仅返回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并计划大量使用此类过滤,请使用此方法。否则,客户端方法应该适合您。