0

嗨,我有一个针对我没有创建的数据库表的链接语句......数据结构是

  • Tbl_BankHols
  • BHDate .... 日期时间
  • E ......... 位
  • S ......... 位
  • W ......... 位
  • 我咬

基本上,它有一个日期列表,然后在 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 是我的国家/地区)我感兴趣)。或者,还有更好的方法?

4

4 回答 4

1

您可以引入一个新的区域(代码、描述)表并将外键添加到指向区域表的表中,而不是按照您编写的方式更改表的结构。然后,您的银行假期表将包含每个(日期/地区)组合的一条记录。

还有你的 linq 声明:

Dim BHQ = From d in db.Tbl_BankHols _
      Where d.BHDate = chkDate And d.Region = "England" _
      Select d.BHDate
于 2013-05-28T08:05:00.323 回答
1

厄姆停止,

您对额外非规范化和使用的建议LIKE是一个非常“错误”的想法。

您需要一张用于国家/地区的表格,我们称之为它Country,而另一个表格用于假期,我们称之为它Holiday。该Country表应包含系统/模型中每个国家/地区的一行。该Holiday表应该有两列。一个用于Date国家的外键,让我们称之为CountryId

然后你的 linq 可能看起来像,

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

你不应该使用它的原因LIKE是多方面的,但有两个主要的反对意见。

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

虽然数据库结构不是最佳的,但如果您使用的是遗留代码并且没有为完整的重构付出任何努力,那么您将不得不去做(我觉得你)。

我认为您拥有的最简单的选择是不仅要选择日期,还要选择属性。

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 回答