避免冗余条件语句

时间:2013-01-09 18:29:27

标签: c# entity-framework lambda

使用以下代码,假设我在变量类型中有5种不同的类型。有没有一种方法可以编写一个并使用变量“type”来决定模型是什么,在这种情况下是“CommentVote?”而不是编写5个条件语句。或者这更像是我设计数据模型的方式的缺陷,这5个事物中的每一个都有“投票”模型?

 if (type == "comment")
 {
      CommentVote voteObj = db.CommentVotes
           .Where(x => x.UserID == UserID && x.CommentID == id)
           .SingleOrDefault();
      if (voteObj != null)
      {
          voteObj.Vote = vote;
          db.SaveChanges();
      }
      else
      {
          CommentVote c = new CommentVote { 
               CommentID = id, UserID = UserID, Vote = vote, DateCreated = DateTime.Now 
          };
          db.CommentVotes.Add(c);
          db.SaveChanges();
      }

      count = (db.CommentVotes.Count(x => x.CommentID == id && x.Vote == true) - db.CommentVotes.Count(x => x.CommentID == id && x.Vote == false));
 }

魔法代码:我希望能够做的事情。

 var modelName = "";
 var modelOtherName = "";
 if (type == "comment") {
      modelName = CommentVote;
      modelOtherName = CommentVotes;
 }

      modelName voteObj = db.modelOtherName
           .Where(x => x.UserID == UserID && x.CommentID == id)
           .SingleOrDefault();

更新:我开始认为我的模型可能是废话,基于下面引用的一些阅读材料。所以我将其中一些作为参考。如果这是我应该尝试解决的问题,请告诉我。

 public class CommentVote
 {
    public int CommentVoteID { get; set; }
    public bool Vote { get; set; }
    public DateTime DateCreated { get; set; }
    public int UserID { get; set; }
    public virtual User User { get; set; } 

    public int CommentID { get; set; }  //This row changes from model to model
    public virtual Comment Comment { get; set; }  //This row changes from model to model
 }

我有一些几乎相同的模型。

3 个答案:

答案 0 :(得分:2)

据我了解你的问题,它与数据库架构有关。

如果这些投票彼此之间没有太大差异(就属性而言),我不会为它们使用不同的表格。而是使用Type列创建一个Vote表,并且(如您提供的示例中)为CommentID创建可为空的列。

然后你可以使用类继承来反映你的投票(投票基类和CommentedVote子类)。

Table Per Hierarchy Inheritance in Entity Framework

<强>更新 最好不要在所有类别中重复相同的属性。你只需使用这样的吸气:

 public abstract class Vote
 {
    public int VoteID { get; set; }
    public bool isVote { get; set; }
    public DateTime DateCreated { get; set; }
    public int UserID { get; set; }
    public virtual User User { get; set; } 

    public int VoteType { get; set;} //this property specifies type of vote (e.g. VoteType=1 for CommentedVote )
 } 
 public class CommentVote : Vote
 {
    public int CommentID { get; set; }  
    public virtual Comment Comment { get; set; }  
 }
 public class OtherVote : Vote
 {
    public int OtherID { get; set; }  
    public virtual Other Other { get; set; }  
 }

this非常好的博客文章中,您可以找到所有可能的方法。我正在撰写的那个名为Table per Hierarchy(TPH)。

答案 1 :(得分:1)

假设您执行相同的操作并设置相同的数据,您绝对可以将代码减少到单个语句。在这种情况下,您应该有一个包含公共操作和数据的接口,以及一个根据类型实例化正确对象的对象工厂。

答案 2 :(得分:0)

如果使用反射实现Factory模式,则可以执行此操作,一个非常基本的示例是shown here

简而言之,您所做的是:由于您可以使用5种不同的类型,因此您可以创建5个不同的类,每个类都实现特定的接口。然后创建工厂类以使用反射来获取最适合您情况的类(无论是使用直接类名,如示例中,还是使用类上的属性,例如{{3 }})。工厂返回该接口的一个实例,然后您可以从界面调用公开的方法为您完成所有这些操作。

最好的部分是,如果你需要制作另一种类型,你所要做的就是添加另一个具有你将在工厂中搜索的属性/名称的类。您的其他代码都不需要受到影响,从而使您符合开放/封闭原则。