【问题标题】:WCF WebApi IQueryable doesn't work with DateTime propertiesWCF WebApi IQueryable 不适用于 DateTime 属性
【发布时间】:2012-03-12 10:26:16
【问题描述】:

我无法通过 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)按 Id 查询(有效):

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

这是 TimeStamp 生成的用于查询的 URL(不起作用):

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

我也可以按日期部分查询(作品):

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

确切的错误消息是 500/Internal Server Error。与消息:

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

问:有什么方法可以在不单独查询每个部分的情况下查询 DateTime 属性?

【问题讨论】:

  • MyModel 是否标记为 DataContract,DateTime 属性是 TimeStamp 是否正确?
  • 它没有被标记为 DataContract。 TimeStamp 是属性的名称(用于本演示),DateTime 是类型。
  • 它应该是一个DataContract。至于时间戳 - 当然:)。
  • 我将 [DataContract] 添加到类,并将 [DataMember] 添加到每个属性。我仍然遇到同样的异常。
  • 更新了服务参考? 查看服务器日志了解更多详情:这是否提供了线索?

标签: c# linq web-services iqueryable wcf-web-api


【解决方案1】:

尽量避免序列化DateTime,为此使用字符串。

例如:

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 格式(文化不变,稳定格式)。

【讨论】:

  • 嗯,已经几个月了,我仍然无法解决这个问题。我相信 IQueryable 可能不支持 DateTime。我已经修改了 IQuerable 方法以接受日期时间作为字符串。
猜你喜欢
  • 2012-10-09
  • 2013-08-04
  • 2023-03-28
  • 1970-01-01
  • 2014-05-13
  • 1970-01-01
  • 2010-10-25
  • 2015-05-09
  • 1970-01-01
相关资源
最近更新 更多