2011-04-03 52 views
10

我对得到的DateTime参数如何发送日期时间参数WCF DataService的

[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; 
} 

曾经语法什么我尝试发送,收到错误DataService在简单的功能。

我试图

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)); 

请指点

+0

是否有任何理由将格式化为字符串的值,为什么不只是传递日期本身,例如AddQueryOption( “的startDate”,DateTime.Now)? – Pepto 2011-04-03 08:14:34

回答

4

我不认为(从我的测试和实验),您可以直接传递DateTime类型的参数。毕竟,在最后(WCF DataService客户端代理及其LINQ-to-WCF良好性的所有优点之后),WCF数据服务始终从URL查询字符串获取它的参数,所以基本上它只是字符串....

(这是形成鲜明对比的使用WCF的SOAP绑定 - 在那里,你绝对可以使用强类型参数 - DateTime和任何你喜欢的,但WCF数据服务是REST,它的所有URL-UND因此,基于字符串)

所以我的结论是:你需要改变你的代码,使用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需要您对此进行一些额外的错误检查 - 这很痛苦,但我认为有必要确保您的代码不会破坏第一时间有人进入没有日期或无效的日期格式....

+0

谢谢我猜这样做的方式 – shlomi 2011-04-04 07:01:22

+1

也许这在前段时间是真实的,但现在不是这样。上面的答案是正确的,ISO8601通过WebGet操作中的URL参数在WCF REST服务中对URL参数工作正常。 – DomenicDatti 2014-05-21 12:31:47

+0

@DomenicDatti:看看日期 - 现在答案已经超过3岁。不幸的是,SO答案不会自动更新自己以适应不断发展的技术...... – 2014-05-21 19:37:57

22

可以通过HTTP请求使用ISO 8601时间戳格式,它表示作为时间yyyy-mm-ddThh:mm:ss(例如提交DateTime对象向服务:2011-06-02T12:24:34 )。

+0

这是正确的答案。谢谢 – onof 2011-11-08 14:02:09

+0

适合我!谢谢 – HuBeZa 2011-11-22 13:37:04