2010-10-30 128 views
2

我正在重构我的代码。考虑下面这个例子......SQL查询的日期时间参数

public virtual List<Student> FetchEnrollmentList(DateTime admissionDateFrom, 
DateTime admissionDateTo) 
    { 
     var students = new List<Student>(); 

      using (oconn = new OleDbConnection(OracleConnection)) 
      { 
       oconn.Open(); 
       query = "SELECT * FROM Enrollment Where AdmissionDate between @AdmissionDateFrom and @AdmissionDateTo "; 

       using (ocmd = new OleDbCommand(query, oconn)) 
       { 
        ocmd.Parameters.Add("@AdmissionDateFrom", OleDbType.Date).Value = admissionDateFrom; 
        ocmd.Parameters.Add("@AdmissionDateTo", OleDbType.Date).Value = admissionDateTo; 

        using (odr = ocmd.ExecuteReader()) 
        { 
         while (odr.Read()) 
          students.Add(new Student { Name = odr["StudentName"].ToString() }); 
        } 
       } 
      } 

     return students; 
    } 

我只是想消除From和To所以我创建了一个类型这样

 public virtual List<Student> FetchEnrollmentList(DateSpan admissionDate) 
    { 
     var students = new List<Student>(); 

     using (oconn = new OleDbConnection(OracleConnection)) 
     { 
      oconn.Open(); 
      query = "SELECT * FROM Enrollment Where AdmissionDate between @AdmissionDateFrom and @AdmissionDateTo "; 

      using (ocmd = new OleDbCommand(query, oconn)) 
      { 
       ocmd.Parameters.Add("@AdmissionDateFrom", OleDbType.Date).Value = admissionDate.Start; 
       ocmd.Parameters.Add("@AdmissionDateTo", OleDbType.Date).Value = admissionDate.End; 

       using (odr = ocmd.ExecuteReader()) 
       { 
        while (odr.Read()) 
         students.Add(new Student { Name = odr["StudentName"].ToString() }); 
       } 
      } 
     } 

     return students; 
    } 

是否确定有它这样的吗?任何其他想法?感谢....

+1

我喜欢第一个例子更好,更容易阅读。你为什么需要重构? – Martin 2010-10-30 17:08:40

+0

我只是希望减少参数的数量,想象如果我有3个日期范围参数像这样在一个单一的方法?我将不得不写3个froms和3 to:p – CSharpNoob 2010-10-30 17:19:51

+0

@Martin借调 – 2010-10-30 17:19:56

回答

1

重的“想象我有3个”评论:那你有3个;)(或3对)

一种替代方法有(视PARAMS增加)是创建表示类查询参数,那么只有1个形式参数。另外,您可以无痛添加选项。例如:

public class StudentSearchRequest { 
    public DateTime FooStart {get;set;} 
    public DateTime FooEnd {get;set;} 
    public bool PublicDataOnly {get;set;} 
    public int SomethigElse {get;set;} 
} 
+0

嗯,听起来很有趣,但实际上我在想这个,因为在我的查询方法中,我必须重载很多方法,因为每个客户端请求的参数数量不同..这种技术显然可以解决超级超载的问题..但是,这是OOP的一个好习惯吗?谢谢.. – CSharpNoob 2010-10-30 17:31:40

2

我同意马丁,只有两个DateTime参数定义列表的界限,实在是没有太大的必要重构,根本没有“代码味道”还没有。

另一方面,如果你介绍其他方法,如你所说使用多个日期范围参数,我会重构一次,我实际上有DateSpan这些方法。通常YAGNI,直到你真的介绍这些方法,只有这样你才应该重构现有的方法来保证一致性。

我不会介绍太多的普遍性,直到真的需要它,重构不是关于你在遥远的未来可能需要什么,而是你可以做些什么来创建更具可读性和可维护性的代码你有和你想添加的功能。

+0

感谢关于yagni原则的一个好建议/讲座.. :) – CSharpNoob 2010-10-30 17:36:52