Как отправить параметры DateTime в WCF DataService

У меня есть простая функция в 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));  

Прошу совета

Ответ 1

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

Ответ 2

Я не думаю (из моих тестов и экспериментов), что вы можете напрямую передавать параметры типа 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 требует, чтобы вы делали дополнительную проверку ошибок с вашей стороны - это боль, но я считаю необходимым убедиться, что ваш код не работает, t прерывать первый раз, когда кто-то не вводит дату или неверный формат даты....