0

我在 LINQ 中遇到以下情况:我有一个对象(博客“帖子”),它有一个可以采用不同值的“状态”字段,并且有一个列出所有这些值的表(这个表只有 Id、Desc) .
现在,由于创建了两个表之间的关系,因此在模型中,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 实例,但主要是因为它太冗长了。
有一个更好的方法吗?

谢谢!
丹尼尔

4

1 回答 1

1

听起来 PostStatus 或多或少是一个枚举。我们一直通过在 DB 中拥有一个相关表(就像您所做的那样)来做这样的事情,但随后删除 DBML 中的关系并将子列上的 CLR 类型更改为枚举类型。枚举类型的声明值与父数据库表中的行相同(在您的情况下,Assign = 20、MarkDone = 30 等)。我编写了一个工具,它从我们所有枚举的代码中填充表的值 - 这样代码就是“主”(如果有人试图更改现有值的值或名称,它会爆炸,但新值“正常工作” )。现在,当您想做类似您正在做的事情时,您需要的数据已经存在于枚举中-只需设置 Post.PostStatus = Action(假设您还将 Action 从字符串更改为相同的枚举类型)- 没有 DB击中必要。

我们还有一些更具动态性的内容——我们在应用程序启动时从数据库缓存一次,然后放入字典中,这样我们就可以在没有数据库命中的情况下设置 ID。只要您不是在谈论数百万个值,它就非常有效。

于 2009-11-14T19:30:14.263 回答