2011-08-04 145 views
0


我正在使用實體框架在C#中開發MVC3應用程序。我有增值稅率表,其中包含增值稅稅率,開始日期,結束日期字段。 開始日期和結束日期可以爲空,以表明這是歷史匯率還是持續匯率。我試圖弄清楚的是,如何在創建單個查詢時考慮這些空值,以便在通過單一日期時爲我提供增值稅率。 (NB例子顯示了英國的日期格式DD/MM/YYYYEF增值稅表在特定日期計算增值稅

 
+--------------+-------------+----------+ 
| Start Date | End Date | Vat rate | 
+--------------+-------------+----------+ 
| Null   | 01/01/2011 | 19  | 
+--------------+-------------+----------+ 
| 02/01/2011 | 08/08/2011 | 20  | 
+--------------+-------------+----------+ 
| 09/08/2011 | Null  | 21  | 
+--------------+-------------+----------+ 

感謝您的時間

+0

這會是麻煩的,我可能會得到它錯了,如果我想......但爲什麼不只是設置起始日期=最低SQL日期值,結束日期=最大SQL日期價值和完全避免邪惡的空值?你也可以只有一個開始日期,你不需要結束日期,然後你的數據永遠不會不一致 - 它可能是錯誤的 - 但不是不一致的。除了我想如果你有兩個開始日期相同但很容易避免。 –

回答

0

如果使用的是EF,你可以做這樣的事情:

DateTime first = DateTime.Parse("01-01-1900"); 
DateTime last = DateTime.Parse("01-01-2100"); 
var rate = db.VatRates.Where(
    vr => input > (vr.StartDate ?? first) && input < (vr.EndDate ?? last)).First().Rate; 

根據下面的評論,沒有EndDate列試試這個:

DateTime start = DateTime.Parse("01-01-1900"); 
var rate = db.VatRates.Where(vr => input > (vr.StartDate ?? start)) 
    .OrderByDescending(vr => vr.StartDate).First().Rate; 

爲我工作:)

+0

是的,我是EF,我認爲我有,但我仍然無法得到我需要的結果。我已經刪除了結束日期列,所以表看起來像以前一樣,但沒有這個列。 – Ben

+0

現在檢查第二個代碼。 –

+0

完美。謝謝 – Ben

0

假設你在@date通過

SELECT  VATRate 
FROM  VATRateTable 
WHERE  @Date 
BETWEEN  ISNULL(StartDate, '1900-01-01') AND ISNULL(EndDate, '2100-01-01') 
+0

這個問題被標記爲entity-framework。 –