Ответ 1
Вы можете отправить объект DateTime
в службу через HTTP-запрос с использованием формата временной метки ISO 8601, который выражает время как yyyy-mm-ddThh:mm:ss
(пример: 2011-06-02T12:24:34
).
У меня есть простая функция в 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));
Прошу совета
Вы можете отправить объект DateTime
в службу через HTTP-запрос с использованием формата временной метки ISO 8601, который выражает время как yyyy-mm-ddThh:mm:ss
(пример: 2011-06-02T12:24:34
).
Я не думаю (из моих тестов и экспериментов), что вы можете напрямую передавать параметры типа 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 прерывать первый раз, когда кто-то не вводит дату или неверный формат даты....