如何让这段代码干?

时间:2011-06-05 20:43:06

标签: c# wcf rest

我正在使用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个模板,以涵盖所有可能的“?”方案

2 个答案:

答案 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   从你的处理人员中检查,   在查询上设置默认值等   参数。

https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=451296&wa=wsignin1.0