如何最好地将枚举与数据库查找表结合使用以获取可读代码

问题描述 投票:0回答:1

我喜欢为对象的静态数据成形属性定义枚举。例如,我一直喜欢在enum中定义的status和type列,其名称和长格式描述如下:

        public enum TordDocumentDocumentTypes
    {
        [System.ComponentModel.Description("Annual Meeting Notice or Materials")]
        AnnualMeeting = 1,
        [System.ComponentModel.Description("Annual Formula Rate Posting")]
        AnnualFormulaRate =2 
    }

然后,我还想将这些枚举转换成可以持久化到查询表中的内容。我倾向于让代码在这里进行“驱动”。这意味着我不让查询从数据库端更改,而是让它更改,因此代码更改了查询。我经常会在应用程序页面的某处有一个函数来执行此操作。

有人能更好地执行这些捕获状态和类型的常用功能吗?

c# sql-server asp.net-core ef-code-first
1个回答
0
投票

使用EntityFramework查询:

它应该支持您要完成的任务。

https://www.entityframeworktutorial.net/EntityFramework5/enum-in-entity-framework5.aspx

使用ADO.NET查询:

如果使用的是ADO.NET,则可以将状态值表示形式从数据库返回的类型转换为枚举(对于插入,反之亦然)。您可以通过为整数创建扩展方法来完成此操作。创建您的DTO集合时可以调用它。

这里有一个代码示例:

public enum Status : int
{
    Unknown = 0,
    Shipped = 1,
    Pending = 2,
    BackOrdered = 3, 
}

public class DatabaseRecord
{
    public int ID { get; set; }
    public string Item { get; set; }
    public int OrderStatus { get; set; }
}

public class DTO
{
    public int ID { get; set; }
    public string Item { get; set; }
    public Status OrderStatus { get; set; }         
}

class Program
{

    static void Main(string[] args)
    {
        List<DatabaseRecord> Database = new List<DatabaseRecord>()
        {
            new DatabaseRecord(){ ID = 1, Item = "Socks",   OrderStatus = 1},
            new DatabaseRecord(){ ID = 1, Item = "Shoes",   OrderStatus = 2},
            new DatabaseRecord(){ ID = 1, Item = "TShirt",  OrderStatus = 11}
        };

        List<DTO> DTOCollection = Database.Select(x => new DTO{
            ID = x.ID,
            Item = x.Item,
            OrderStatus = x.OrderStatus.ToEnum<Status>(Status.Unknown)               
        }).ToList();

        foreach(var memberOfDTO in DTOCollection)
        {
            Console.WriteLine($"{ memberOfDTO.OrderStatus }");
        }
    }
}

public static class Extenstions
{
    public static T ToEnum<T>(this int integer, T defaultValue)  where T : struct, IConvertible
    {                        
        if (Enum.IsDefined(typeof(T), integer))
        {
            return (T)Enum.Parse(defaultValue.GetType(), integer.ToString());
        }
        return Activator.CreateInstance<T>();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.