关于c#:将枚举与从DB返回的整数值进行比较的最简单方法是什么

What's the simplest way to compare an enum to a integer value return from a DB

我正在使用Linq2SQL从表中提取一些数据…其中一个数据块是一个值,它表示应用程序代码中的枚举。

比较Linq对象中返回的数据和应用程序代码中的枚举的最简单方法是什么?例如

1
2
3
4
5
enum SomeEnum
{
  First
  Second
}

那么在我的方法中

1
2
3
4
5
6
7
8
9
10
Table<LinqObject> objects = dc.GetTable<LinqObject>();

foreach (var item in objects)
{
   // What's the simplest way to do this comparison???
   if (item.SomeNullableInteger == SomeEnum.First) // Note I realise this doesn't work!!!
   {
      // Do something...
   }
}

我能做到这一点

1
SomeEnum.First.Equals(item.SomeNullableInteger)

或者我可以将枚举名称存储在数据库中,然后我就可以这样做了

1
Enum.GetName(SomeEnum, SomeEnum.First) == item.SomeNullableName

有更好的方法吗?枚举只有两个项,它们非常固定……可能有三分之一或四分之一,但可能永远不会超过这个值。所以整张桌子似乎太过分了。

实际上,这是C int到枚举转换的副本


这应该如预期的那样工作-只是强制转换为基类型。

1
item.SomeNullableInteger == (Int32)SomeEnum.First

更新

最好和最干净的解决方案可能是更新DBML文件。

  • 在设计器中打开DBML文件。
  • 选择实体的枚举类型属性。
  • 打开属性窗口。
  • 将所选属性的字段TypeSystem.Int32更改为类似于global::SomeNamespace.SomeEnum的字段。也许没有global限定符就可以了,但我不确定。
  • 现在,如果重新生成代码,则属性将是枚举类型,而不是整数。如果您有可以为空的属性,那么当然必须使用可以为空的枚举类型。


    根据官方文档,可以将枚举强制转换为int进行比较。

    1
    if (item.SomeNullableInteger == (int)SomeEnum.First)

    http://msdn.microsoft.com/en-us/library/sbbt4032.aspx

    为了代码清晰,将枚举声明为

    1
    2
    3
    4
    5
    enum SomeEnum
    {
       First = 1;
       Second = 2;
    }


    将枚举强制转换为int应该可以做到这一点。


    拥有

    1
    item.SomeNullableInteger == SomeEnum.First

    工作:

    • 请注意,first=0&second=1(在该枚举声明之后)
    • someNullableInteger的类型为int
    • 当然,someNullableInteger=0表示第一个,someNullableInteger=1表示第二个。


    你可以把Enum投射到int上:

    1
    2
    3
    4
    if (item.SomeNullableInteger == (int)SomeEnum.First)
    {
         // Do something...
    }