我喜欢为对象的静态数据成形属性定义枚举。例如,我一直喜欢在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
}
然后,我还想将这些枚举转换成可以持久化到查询表中的内容。我倾向于让代码在这里进行“驱动”。这意味着我不让查询从数据库端更改,而是让它更改,因此代码更改了查询。我经常会在应用程序页面的某处有一个函数来执行此操作。
有人能更好地执行这些捕获状态和类型的常用功能吗?
使用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>();
}
}