我使用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。
我需要做些什么来过滤实体?
答案 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并计划大量使用此类过滤,请使用此方法。否则,客户端方法应该适合您。