我正在使用C#/ wcf编写RESTful服务,需要在GET上添加过滤器。就像要返回多少条记录一样,也许我想过滤一些东西等等。考虑一下这段代码:
[WebGet(UriTemplate = "/devices/{DeviceId}/positions")]
public List<GPSPosition> GetDevicePositions(string deviceId)
{
//Lookup device:
using (var context = new MobileModelContext(ContextManager.AccountGKey.Value))
{
var d = context.Devices.Where(aa => aa.DeviceId == deviceId).FirstOrDefault();
if (d == null)
{
outgoingResponse.StatusCode = HttpStatusCode.NotFound;
outgoingResponse.StatusDescription = "Device not found";
return null;
}
var query = from p in context.Positions
where p.DeviceKey.Equals(d.DeviceKey)
select new GPSPosition
{
PositionGKey = p.PositionGKey,
Latitude = p.Latitude,
Longitude = p.Longitude,
Speed = p.Speed,
Accuracy = p.Accuracy,
Altitude = p.Altitude,
GPSTime = p.GPSTime,
DeviceTime = p.DeviceTime
};
return query.ToList();
}
}
[WebGet(UriTemplate = "/devices/{DeviceId}/positions?RecordCount={RecordCount}")]
public List<GPSPosition> GetDevicePositions2(string deviceId, int recordCount)
{
//Lookup device:
using (var context = new MobileModelContext(ContextManager.AccountGKey.Value))
{
var d = context.Devices.Where(aa => aa.DeviceId == deviceId).FirstOrDefault();
if (d == null)
{
outgoingResponse.StatusCode = HttpStatusCode.NotFound;
outgoingResponse.StatusDescription = "Device not found";
return null;
}
var query = from p in context.Positions
where p.DeviceKey.Equals(d.DeviceKey)
select new GPSPosition
{
PositionGKey = p.PositionGKey,
Latitude = p.Latitude,
Longitude = p.Longitude,
Speed = p.Speed,
Accuracy = p.Accuracy,
Altitude = p.Altitude,
GPSTime = p.GPSTime,
DeviceTime = p.DeviceTime
};
return query.Take(recordCount).ToList();
}
}
很多重复。我可以将代码移动到其他功能但是,我有2个模板,我有2个功能。有没有办法为/ positions /制作1个模板,以涵盖所有可能的“?”方案
答案 0 :(得分:3)
列举源和 产生元素直到计数元素 已经屈服或源包含 没有更多元素。
由于Take(n)
以最多 n个项目返回,但如果可用次数较少则会减少,您可以重写:
public List<GPSPosition> GetDevicePositions(string deviceId)
{
return GetDevicePositions2(deviceId, int.MaxValue)
}
然后将返回所有项目。
答案 1 :(得分:2)
质量保证提示:context.Devices.Where(aa => aa.DeviceId == deviceId).FirstOrDefault();
可以缩短为context.Devices.Find(deviceId);
质量保证提示:from p in context.Positions ...
您可能想在桌面上创建一个视图而不是... select new GPSPosition { ... }
,而只需定期编写context.PositionViews.Where(x => x.DeviceKey == d.DeviceKey).ToList();
质量保证提示:您可能希望使用.AsNoTracking()
来优化效果。
QA提示:您可能希望在方法声明中使用可选参数。例如:
public List<GPSPosition> GetDevicePositions(string deviceId, int limit = 20)
{
// you code here
}
或者如果WCF不支持,那么。这是一个解决方法:
您可以通过以下方式获得所需的效果 从中省略查询字符串 UriTemplate在您的WebGet或 WebInvoke属性,并使用 WebOperationContext.Current.IncomingRequest.UriTemplateMatch.QueryParameters 从你的处理人员中检查, 在查询上设置默认值等 参数。