2011-04-03 22 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