我在LINQ中有以下情况:我有一个对象(博客“Post”),它有一个“Status”字段,可以采用不同的值,还有一个列出所有这些值的表(这个表只有Id ,Desc)。
现在,由于创建了两个表之间的关系,因此在Model中,Post.Status不是int,而是“PostStatus”的实例。
因此,如果我想将Post的状态设置为20,我不能将该字段设置为20,我需要分配一个PostStatus实例。这些状态值都是用逻辑硬编码的,所以在我的代码中硬编码“20”就好了。
有没有更好的方法呢?
switch (Action) {
case "Ignore":
post.PostStatus = (from s in db.PostStatus where s.Id == 90 select s).First();
break;
case "Assign":
post.PostStatus = (from s in db.PostStatus where s.Id == 20 select s).First();
break;
case "MarkDone":
post.PostStatus = (from s in db.PostStatus where s.Id == 30 select s).First();
break;
case "MarkPublished":
post.PostStatus = (from s in db.PostStatus where s.Id == 40 select s).First();
post.Public = true;
break;
}
我讨厌这段代码,老实说,首先是因为它不必要地查询数据库以获取PostStatus实例,但主要是因为它只是如此冗长。
有更好的方法吗?
谢谢!
丹尼尔
答案 0 :(得分:1)
听起来PostStatus或多或少是一个枚举。我们一直通过在DB中创建一个相关表来做这样的事情(就像你一样),但是然后删除DBML中的关系并将子列上的CLR类型更改为枚举类型。枚举类型声明的值与父DB表中的行相同(在您的情况下,Assign = 20,MarkDone = 30等)。我编写了一个工具,从我们所有枚举的代码中填充表的值 - 这样代码就是“主”(如果有人试图更改现有值的值或名称,它会发生炸弹,但是新值“正常工作” )。现在当你想做你正在做的事情时,你需要的数据就已经在枚举中设置了Post.PostStatus = Action(假设你也将Action从一个字符串改为同一枚举类型) - 没有数据库必要的。
我们还有一些更动态的 - 我们在应用启动时从数据库缓存一次并放入一个字典中,这样我们就可以设置ID而不会发生数据库命中。只要你不是在谈论数百万的价值观,那就非常有效。