我正在处理ASP.NET MVC 4
应用程序,即使对于这个确切的问题,我认为这是无关紧要的。我将EF 5
与Code First
一起使用,我有实体Menu
,其中菜单可以是四种不同类型之一。在我的实体中,菜单的类型声明为
public class Menu
{
//other properties
public int Type { get; set; }
}
我已将不同类型声明为常量:
public static class MenuType
{
public const int Report = 10;
public const int Contract = 20;
public const int Taxes = 30;
public const int Interests = 40;
}
因此,如果我想从Contract
类型中获取所有菜单,我就会这样:
unitOfWork.MenuRepository.GetAll().Where(x => x.Type == MenuType.Contract).ToList();
即使它工作正常我想用枚举值更改它,我试过这个:
public static class MenuType
{
public static enum Types
{
Report = 10,
Contract = 20,
Taxes = 30,
Interests = 40
}
}
但是从我的代码上面检索相同的记录是:
unitOfWork.MenuRepository.GetAll().Where(x => x.Type == (int)(MenuType.Types.Contract)).ToList();
更难以理解,写作也更多。我已经看到enums
的使用方式类似于我使用常量的方式。我不确定,也许我必须实施其他方法。
但是如何在不使查询更难以理解的情况下更改enum
值的常量?也许还有一些额外的方法,比如MenuTypeValue("Contract")
...
答案 0 :(得分:2)
您必须更改Menu
类上的属性类型以匹配您声明的新枚举
public class Menu
{
//other properties
public Types Type { get; set; }
}
通过这种方式,您可以将枚举与枚举进行比较,您的代码将再次变得美观和清晰。
如果你不能这样做,你可能会更好地坚持int
常数,或者你需要一直在int
和枚举类型之间进行投射。
答案 1 :(得分:1)
将模型中的属性类型“类型”更改为枚举。 EF5足够智能,可以在内部将其转换为int。
答案 2 :(得分:1)
如果您要做的是让它更具可读性,那么为什么不将逻辑移到存储库类中。
所以你可以打个电话:
unitOfWork.MenuRepository.GetAll(MenuType.Type.Contract);
然后在您的存储库中只有一个方法,如:
List<...> GetAll(MenuType.Type type = null) { ... }
所以现在你仍然可以在没有类型的情况下调用GetAll,因为它是一个可选的参数,但在那个方法中你可以找出你需要返回的内容。你的电话看起来会更清洁。