【问题标题】:Using identity fields in a switch statement在 switch 语句中使用标识字段
【发布时间】:2009-09-30 10:19:55
【问题描述】:

我有一个这样的 SQL 查找表:

CREATE TABLE Product(Id INT IDENTITY PRIMARY KEY, Name VARCHAR(255))

我已将 ASP.NET DropDownList 数据绑定到 LLBLGen 实体。用户选择产品,ID 被保存。现在我需要稍后显示一些产品特定的详细信息。我应该使用产品的 ID,并希望 ID 在安装之间始终相同吗?

switch (selectedProduct.Id)
{
case 1: //product one
  break;
case 2:
case 3: //product two or three
  break;    
}

还是用名字,希望永远不变?

switch (selectedProduct.Name)
{
case "product one":
  break;    
}

或者有更好的选择吗?

【问题讨论】:

  • 你们所有的产品都是同一类型的吗?如果是,那么您可以编写以 ID 作为参数并提供详细信息的单一方法。如果可以添加新类型,那么您将不得不在 switch 中编写新函数和新 case 语句。

标签: c# switch-statement identity


【解决方案1】:

如果您知道此表中的所有项目(如果您可以打开它们,我猜您会这样做)并且希望它们在每次安装时都相同,那么它可能不应该是一个标识列,您应该插入 1 , 2, 3 与产品本身。

【讨论】:

    【解决方案2】:

    对于这种情况,我见过三种常见的解决方案:

    1. 对 ID 进行硬编码 - 这既快速又肮脏,不是自我记录(您不知道所指的是什么产品),并且如您所指出的那样容易损坏。我再也不用这种方法了。
    2. Enums - 当表格很小且是静态的时,我会使用它。因此,ProductType 可能是这个的候选者。这是自记录代码,但仍然在代码和数据之间创建了一个尴尬的连接,如果插入的记录具有与您计划的不同的 ID,那么事情就会中断。您可以通过以各种方式自动生成 Enum 来缓解这种情况,但仍然感觉不对。例如,如果您的单元测试将记录插入到 Product 表中,那么他们将很难在那时重新创建 Enum。此外,如果您有 100,000 条记录,则 Enum 方法开始看起来很愚蠢。
    3. 添加一个额外的列,这是一个不变的标识符。我经常使用 AlphaCode 作为我的列名。所以在你的情况下,它看起来像:

        switch (selectedProduct.AlphaCode)
        {
            case "PRODUCT_ONE":
                break;
    }
    这允许您使用自记录的 AlphaCode,允许您重新插入数据而无需关心自动增量 PK 值,并允许您更改产品名称而不影响任何内容。如果您使用 AlphaCode 方法,请确保在此列上放置唯一索引。

    另一种解决方案(通常是最可取的解决方案)是将这个逻辑移到数据库中。例如,如果产品 1 是您在选择其类别时始终希望默认显示的产品,您可以在表中添加一个名为 IsHeroProduct 的列。那么你的查询就变成了:

        if (selectedProduct.IsHeroProduct)
        {
            //do stuff
    }

    【讨论】:

    • 感谢(第二)建议,但我需要为每个产品显示一些文本文件,所以我认为数据库不是去的地方。
    • 我最终在数据库“enumcode”中使用了一个额外的列,它在安装之间不会改变,并在 C# 中手动编码一个枚举
    【解决方案3】:

    如果您希望修复您的 ProductID(这似乎不是一个好主意),那么您可以使用 IDENTITY INSERT(至少在 SQL Server 中)来确保安装之间的 ProductID 值相同。但是,我通常只会对静态参考数据执行此操作。

    您也可以使用 Visual Studio 的 T4 模板直接从数据库数据中生成enums

    【讨论】:

      【解决方案4】:

      一些 ORM(至少是 LLBLGen)可以为您处理这个问题;但会生成强类型的枚举。不过我从来没用过。

      在这些情况下,我总是只使用我自己编写的枚举,但我确保所有字段都是平等的,如果有任何变化,我会更新。当你跨数据库工作时会变得更有趣(就像我一样),但如果你小心,它就足够简单了。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-27
      • 2021-12-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多