0

こんにちは、作成していないデータベース テーブルに対するリンク ステートメントがあります...データ構造は次のとおりです。

  • Tbl_BankHols
  • BHDate .... 日時
  • え……ビット
  • S……ビット
  • わ……ビット
  • 私…………ビット

基本的に、日付のリストと、E、S、W、I の 0 または 1 の値があり、その日付がイングランド、スコットランド、ウェールズ、および/またはアイルランドの祝日であるかどうかを示します。

日付がいずれかの国で銀行休業日であるかどうかを知りたい場合、私の Linq ステートメントは次のとおりです。

Dim BHQ = From d in db.Tbl_BankHols _
          Where d.BHDate = chkDate _
          Select d.BHDate

chkDate は、チェックしている日付です。結果が返された場合、日付はいずれかの国の銀行休業日です。

chkDate が特定の国の銀行休業日であるかどうかを調べる必要があります。それを where ステートメントに導入するにはどうすればよいですか?

データベースの構造を変更することを考える前に、これが可能かどうかを尋ねています。E、EW、EWS、EWSI、I、およびその他の同様の組み合わせのような値を含む文字列として単一の国フィールドを使用することを考えていたので、WHERE BCountry LIKE %X% (X は国 I'私は興味があります)。それとももっと良い方法がありますか?

4

4 に答える 4

1

えっと、やめて、

余分な非正規化と使用に関するあなたの提案LIKEは、本当に「間違った」考えです。

国用に 1 つのテーブルが必要です。それを呼びましょう。Country休日用に別のテーブルを呼びましょうHoliday。テーブルには、システム/モデルのCountry国ごとに行が含まれている必要があります。Holidayテーブルには 2 つの列が必要です。の 1Dateつと国への外部キー、それを と呼びましょうCountryId

次に、linq は次のようになります。

db.Holiday.Any(Function(h) h.Country.Name = 
                    "SomeCountry" AndAlso h.Date = someDate)

これを使用すべきではない理由は多岐にわたりますLIKEが、2 つの主な反論があります。

LIKEうまく機能しない、インデックスがそれをサポートするのが難しい、そして、

これらの国の祝日を保存する必要がある状況を想像してみましょう。

エクアドル

エルサルバドル

エストニア

エチオピア

イングランド

さて、あなたはすでに"E"イングランドにコードを割り当てました。他の人にはどのコードを与えますか? あなたが言うのは問題ありません、、"EL"..."ET"しかし、あなたの状態はすでにLIKE "%E"壊れています。


以下は、私が使用するスキーマのスクリプトです。

CREATE TABLE [Country](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](100) NOT NULL,
    CONSTRAINT [PK_Country] PRIMARY KEY CLUSTERED
    (
        [Id] ASC
    ));

CREATE TABLE [Holiday](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Date] [date] NOT NULL,
    [CountryId] [int] NOT NULL FOREIGN KEY Country(Id),
    CONSTRAINT [PK_Country] PRIMARY KEY CLUSTERED
    (
        [Id] ASC
    ));
于 2013-05-28T08:14:06.143 に答える
0

データベースの構造を変えることを考える前に

LINQKitORを使用して、述語を含むクエリを作成することでそれを行うことができます。

Dim IQueryable<BankHoliday> BHQ = ... (your query)

Dim pred = Predicate.False(Of BankHolifday)

If countryString.Contains("E")
    pred = pred.Or(Function(h) h.E)
EndIf
If countryString.Contains("S")
    pred = pred.Or(Function(h) h.S)
EndIf
...

Return query.Where(pred.Expand())

(私はVBに堪能ではないので、そこにいくつかのエラーがあるかもしれません)

同様の例については、この回答を参照してください。

于 2013-05-28T09:16:47.560 に答える
0

DB 構造は最適ではありませんが、レガシー コードを使用していて、完全なリファクタリングに労力を割いていない場合は、何とかしなければなりません (私はあなたに同情します)。

最も簡単なオプションは、日付だけでなく属性も選択することです。

Dim BHQ = From d in db.Tbl_BankHols _
          Where d.BHDate = chkDate _
          Select d

このコードは、dS、dE、dW、および dI を提供します。これらをプログラムで使用して、現在作業している国に休日が適用されるかどうかを判断できます。これは、クエリの外に、休日が処理している国に適用されるかどうかを判断する別の if ステートメントがあることを意味します。

于 2013-05-28T09:47:34.450 に答える