2013-07-30 33 views
2

我有在MVC應用程序2個輸入: date_from和DATE_TO(這僅在圖日期,而不是日期時間)日期從和過濾無時間C#MVC

當我調用一個服務來獲取結果過濾由這些值我打電話

Result result = client.GetResults(from = date_from, to = date_to); 

邏輯在GetResults做一個LINQ在這樣一個EF5:

context.Results.Where(r=> r.date >= date_from && r.date <= date_to); 

由於僅查看具有DateTi的日期部分我,如果我通過 來自:2013年12月1日至 :2013年12月1日

唯一的結果我得到的是那些在小時0:0:0

我想要做的就是通話該服務以日期結束爲準。

  • 注:我不想更改服務邏輯,因爲時間在其他地方使用。
  • NOTE2:我不想送date_to.AddDays(1),因爲它會告訴我從另一個日期數據爲0:0:0小時。

有什麼好的解決辦法?我想出了date_to.AddDays(1).AddMilliseconds(-1),但不認爲是一個好辦法。

謝謝。

+0

爲什麼你認爲這不是一個好的解決方案? –

+0

你爲什麼認爲這不是一個好的解決方案?我想這是完全可以接受的。 – Ehsan

+0

@ Moo-Juice看起來像是以這種方式結束這一天有點hacky,也許我錯了? –

回答

10

最簡單的方法是添加了一天,但改變的上限是獨家:

var lowerBoundInclusive = date_from; 
var upperBoundExclusive = date_to.AddDays(1); 
context.Results.Where(r=> r.date >= lowerBoundInclusive && 
          r.date < upperBoundExclusive); 

這樣的半開區間是不錯的,因爲它們自然地緊靠 - 您可以使用專屬上限一個區間作爲下一個區間的下限,等等 - 每個值都將落入一個區間。這也意味着每個邊界都是很好的圓整值,這很容易閱讀。

編輯:好吧,評論它聽起來像我們正在得到的地方 - 問題是,當您使用DateTime當你處理「只是日期」和「日期和時間」。表達與日期的間隔通常情況下,您使用的包容間隔(「我在假期星期一至星期五」),而使用日期和時間您使用獨家上限(「我的第一次見面是3:00-凌晨4點,我的第二個是4:00-5:00「 - 4:00你的第一次會議已經完成,第二個已經開始)

我建議寫兩個方法,其中一個可以調用。其他:

// This is *inclusive* of both bounds 
public XYZ GetResultsByDate(DateTime fromDate, DateTime toDate) 
{ 
    return GetResultsByDateAndTime(fromDate.Date, toDate.Date.AddDays(1)); 
} 

// This is *exclusive* of the upper bound 
public XYZ GetResultsByDateAndTime(DateTime from, DateTime to) 
{ 
    var results = context.Results.Where(r=> r.date >= from && r.date < to); 
    ... 
} 
+0

這比添加/刪除更好的 - 特別是如果一些時髦的一天,他們決定把日期時間分辨率高:) –

+0

就像我說我注意到,該服務使用的時間部分的邏輯。這樣做會使用時間部分以DateTime打破請求。任何時間不同於0:0:0的輸入都可能返回錯誤的結果。 –

+0

@Bart:說實話,你的問題很不明確。你說'date_from'和'date_to'是僅限日期的,所以推測他們已經有了00:00:00的時間。我希望*這可以和EF一起工作,這是我代碼影響的唯一部分。我並不是建議改變其他邏輯。 –