Как вернуть перечисления в представление списка из таблицы данных? - PullRequest
0 голосов
/ 24 марта 2020

У меня есть список для возврата данных из базы данных.

sampleditemlist.Add(new SampledItem() {
                        SampledItemID = row["SampledItemID"] == DBNull.Value ? 
                            0 : 
                            int.Parse(row["SampledItemID"].ToString()),
                        SerialNumber = row["SerialNumber"] == DBNull.Value ? 
                            "" : 
                            row["SerialNumber"].ToString(),

                    });

У меня есть перечислимый класс следующим образом.

 public enum EnumSampledCategory
    {
        All = 1,
        Government_Sampling = 2,
        Sampling_In_Packaging = 3,
        Sampling_At_Warehouse = 4
    }

Как я могу использовать это enum для выбранной категории, например

SampledItemID = row["SampledItemID"] == DBNull.Value ? 
    0 : 
    int.Parse(row["SampledItemID"].ToString())

?

Ответы [ 4 ]

1 голос
/ 24 марта 2020

Вам не нужно преобразовывать значение DataRow в строку, а затем анализировать его как целое, если столбец базы данных имеет тип Int (мое предположение), тогда DataRow имеет целочисленный тип, вам нужно только привести это, потому что DataRow возвращает значения типа object.

Если столбец допускает значения null, приведите его к обнуляемому целому числу. Вы можете использовать метод расширения .Field<T>

Когда вы получите целочисленное значение, вы можете привести к типу enum

var category = 
    (EnumSampledCategory)row.Field<int?>("SampledItemId").GetValueOrDefault();

Для string типов

var serialNumber = row.Field<string>("SerialNumber");

Нет необходимости в проверке DbNull, string является ссылочным типом и имеет значение null, поэтому null будет возвращено, когда значение в DataRow равно NULL

0 голосов
/ 24 марта 2020

Значение enum может быть сохранено в базе данных как int или varchar или nvarchar. Давайте рассмотрим, что enum сохранен как int в базе данных. Затем вы можете привести его к типу перечисления.

EnumSampledCategory sampledCategory= row["SampledItemId"] == DBNull.Value ? EnumType.None : (EnumType)(int)row["SampledItemId"];

Итак, просто добавьте еще один None в вашем перечислении в качестве значения 0 и используйте его в качестве значения по умолчанию, если значение равно нулю в базе данных.

0 голосов
/ 24 марта 2020

Во-первых, давайте добавим значение для 0:

  public enum EnumSampledCategory
  {
      None                  = 0, // corresponds to null in RDBMS
      All                   = 1,
      Government_Sampling   = 2,
      Sampling_In_Packaging = 3,
      Sampling_At_Warehouse = 4
  }

Если возможно, что SampledItem может быть и Sampling_In_Packaging, и, скажем, Government_Sampling вас может захотеть превратить enum в помеченный один:

  [Flags]
  public enum EnumSampledCategory
  {
      None                  = 0,
      Government_Sampling   = 1,
      Sampling_In_Packaging = 2,
      Sampling_At_Warehouse = 4,
      // All is combination of all other samplings: 1 | 2 | 4 == 7
      All = Government_Sampling | Sampling_In_Packaging | Sampling_At_Warehouse
  }

Тогда все, что вы хотите, это Convert:

  MySampledCategory = (EnumSampledCategory)Convert.ToInt32(
    row["SampledCategory"] == DBNull.Value ? 0 : row["SampledCategory"]);
0 голосов
/ 24 марта 2020

это самое полезное

 namespace ConsoleApp9
{
    class Program
    {
        static void Main(string[] args)
        {
            int id = 3;
            var s = (EnumSampledCategory)id; // s variable take this valie=>Sampling_In_Packaging 
        }
    }
    public enum EnumSampledCategory
    {
        All = 1,
        Government_Sampling = 2,
        Sampling_In_Packaging = 3,
        Sampling_At_Warehouse = 4
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...