2011-08-04 12 views
0


私はMVC3アプリケーションをC#でEntity Frameworkを使用して開発しています。 VAT率、開始日、終了日のフィールドを持つVATレートテーブルがあります。 開始日と終了日は、これが過去のレートまたは進行中のレートのいずれかであることを示すためにnullにすることができます。私が把握しようとしているのは、これらのNULLを考慮して単一の日付で渡すときに弁別率を与える単一のクエリを作成する方法です。 (例をNBは、英国の日付形式DD/MM/YYYYを示してお時間をEF VATテーブル特定の日付のVATレートの計算

 
+--------------+-------------+----------+ 
| 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の日付を設定していない理由だろう価値と悪のnullsを完全に避ける?また、開始日があるだけでなく、終了日を必要とせず、データが矛盾しないようにすることもできます。間違っている可能性がありますが、矛盾はありません。あなたは2つの開始日が同じであるが、避けがたいのであれば私は仮定します。 –

答えて

0

を想定すると、

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; 

以下のコメントによれば、終了日の列には次のように入力してください:

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

今すぐ2番目のコードを確認してください。 –

+0

パーフェクト。ありがとう – Ben

0

あなたがEFを使用している場合は、あなたが行うことができますあなたが@Date

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

質問にはentity-frameworkタグが付けられています。 –

関連する問題