Как отправить параметры DateTime в WCF DataService - PullRequest
11 голосов
/ 03 апреля 2011

У меня есть простая функция на DataService, которая получает параметр DateTime

[WebGet]
public IQueryable<Job> LoadJobsByDate(DateTime startDate, DateTime endDate)
{
    var context = this.CurrentDataSource;

    var jobs = from j in context.Jobs
               where j.CreatedDate >= startDate && j.CreatedDate <= endDate
               select j;

    return jobs;
}

Какой бы синтаксис я ни пытался отправить, я получаю сообщение об ошибке.

Я пытался

var query1 = newContext.CreateQuery<Job>("LoadJobsByDate")
             .AddQueryOption("startDate", 
                 string.Format ("'{0:yyyy-MM-ddTHH:mm:ss}'", DateTime.Now));  

или

var query1 = newContext.CreateQuery<Job>("LoadJobsByDate")
             .AddQueryOption("startDate", 
                 string.Format ("'datetime{0:yyyy-MM-ddTHH:mm:ss}'", DateTime.Now));  

Пожалуйста, совет

Ответы [ 2 ]

24 голосов
/ 02 июня 2011

Вы можете отправить объект DateTime в службу через HTTP-запрос, используя формат отметки времени ISO 8601, который выражает время как yyyy-mm-ddThh:mm:ss (пример: 2011-06-02T12:24:34).

4 голосов
/ 03 апреля 2011

Я не думаю (из моих тестов и экспериментов), что вы можете передавать параметры типа DateTime напрямую.В конце концов (после всех тонкостей клиентского прокси WCF DataService и его достоинства LINQ-to-WCF) службы данных WCF всегда получают свои параметры из строки запроса URL, поэтому в основном все это просто строки....

(это резко контрастирует с использованием привязок SOAP для WCF - там вы, безусловно, можете использовать строго типизированные параметры - DateTime и все что угодно. Но службы данных WCF - это REST, этовсе URL - и, следовательно, на основе строк)

Итак, мой вывод: вам нужно изменить код, чтобы использовать параметры string, а затем преобразовать их в DateTime внутри вашего метода:

[WebGet]
public IQueryable<Job> LoadJobsByDate(string startDate, string endDate)
{
    // some error checking needs to be done here! If 'startDate' or 'endDate'
    // are NULL or emtpy string --> fall back to a default

    // also - you might want to check into .ParseExact and define a list of valid,
    // supported date formats that you want to offer your users
    DateTime startDt = DateTime.Parse(startDate);
    DateTime endDt = DateTime.Parse(endDate);

    var context = this.CurrentDataSource;

    var jobs = from j in context.Jobs
               where j.CreatedDate >= startDt && j.CreatedDate <= endDt
               select j;

    return jobs;
}

Как я уже упоминал во фрагменте кода - для того, чтобы получить строки и разобрать их в DateTime, требуется дополнительная проверка ошибок с вашей стороны - это боль, но я думаю, что необходимо убедиться, что ваш код не 'не вводить первый раз, когда кто-либо вводит дату или формат даты неверный ....

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