WCF WebApi IQueryable не работает со свойствами DateTime

Я не могу запросить какой-либо объект по свойствам DateTime.

public class MyModel
{
    public int Id { get; set; }
    public DateTime TimeStamp { get; set; }
}


[ServiceContract]
public class BuildJobApi
{
    [WebGet]
    public IQueryable<MyModel> GetMyModels()
    {
        return _service.GetMyModels(); // IQueryable<MyModel>
    }
}

Я пытался использовать WCF WebApi v0.5.0 и 0.6.0, оба выдают сообщения об ошибках.

Вот URL-адрес, сгенерированный (WebApi) для запроса по идентификатору (работает):

/api/models?$filter=(Id eq 100)

Вот URL-адрес, сгенерированный для запроса TimeStamp (не работает):

/api/models?$filter=TimeStamp ge DateTime'2012-02-22T00:00:00'

Я также могу запросить по дате (работает):

/api/models?$filter=(year(ExceptionDateTime) eq 2012)

Точное сообщение об ошибке — 500/Внутренняя ошибка сервера. С сообщением:

The server encountered an error processing the request. See server logs for more details.

Вопрос. Можно ли что-нибудь сделать для запроса свойств DateTime, не запрашивая каждую часть отдельно?


person joelnet    schedule 22.02.2012    source источник
comment
Помечен ли MyModel как DataContract и правильно ли свойство DateTime является TimeStamp?   -  person Gert Arnold    schedule 23.02.2012
comment
Он не помечен как DataContract. TimeStamp — это имя свойства (для целей этой демонстрации), DateTime — это тип.   -  person joelnet    schedule 23.02.2012
comment
Это должен быть DataContract. Насчет TimeStamp - конечно :).   -  person Gert Arnold    schedule 23.02.2012
comment
Я добавил [DataContract] в класс и [DataMember] в каждое свойство. Я все еще получаю то же исключение.   -  person joelnet    schedule 23.02.2012
comment
Обновили ссылку на сервис? Дополнительные сведения см. в журналах сервера: дает ли это подсказку?   -  person Gert Arnold    schedule 23.02.2012


Ответы (1)


Старайтесь избегать сериализации DateTime, используйте для этого строку.

eg:

public class MyModel
{
    public int Id { get; set; }
    public string TimeStamp { get; set; }
}

new MyModel { Id = 123, TimeStamp = DateTime.Now.ToString("o") };

"o" для формата ISO 8601 (культурно-независимый, стабильный формат).

person SeriousM    schedule 12.04.2012
comment
Прошло несколько месяцев, а я до сих пор не могу решить эту проблему. Я считаю, что DateTime может не поддерживаться для IQueryable. Я изменил свой метод IQuerable, чтобы он принимал дату и время в виде строки. - person joelnet; 11.12.2012