Как сделать этот код СУХИМ? - PullRequest
3 голосов
/ 06 июня 2011

Я пишу RESTful-сервис на C # / wcf и мне нужно установить фильтры на 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 функции.Есть ли способ сделать 1 шаблон для / position /, который охватит все возможные "?"сценарии?

Ответы [ 2 ]

3 голосов
/ 06 июня 2011

Возьмите, перечисляет источник и возвращает элементы до тех пор, пока не будет получено количество элементов или источник не содержит больше элементов.

Поскольку Take(n) возвращает примаксимум n элементов, но меньше, если доступно меньше, вы можете переписать:

  public List<GPSPosition> GetDevicePositions(string deviceId)
  {
    return GetDevicePositions2(deviceId, int.MaxValue)
  }

, который затем вернет все элементы.

2 голосов
/ 06 июня 2011

Подсказка QA : context.Devices.Where(aa => aa.DeviceId == deviceId).FirstOrDefault(); можно сократить до context.Devices.Find(deviceId);

QA Hint : from p in context.Positions ... вы можете создать представление на своей таблице, и вместо ... select new GPSPosition { ... } вы просто напишите обычный context.PositionViews.Where(x => x.DeviceKey == d.DeviceKey).ToList();

Подсказка QA : Вы можете использовать .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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...