ASP.NET嵌套OOP查询性能的最佳方法

时间:2012-03-15 09:09:52

标签: c# asp.net oop nested

//选项1

public class division
{
    public int DivisionId { get; set; }
    public string DivisionName { get; set; }
    public employee Employee { get; set; }

    public class employee
    {
        public int EmpId { get; set; }
        public string EmpName { get; set; }

        public employee(int id)
        {
            sql = new SqlCommand("select empid,empname from employee where divisionid = '" + id + "'", conn);
            conn.Open();
            dt = sql.ExecuteReader(CommandBehavior.SingleRow);
            if (dt.Read())
            {
                EmpId = id;
                EmpName = (string)dt["empname"];
            }
            dt.Close();
            conn.Close();
        }
    }
    public division(int id)
    {
        sql = new SqlCommand("select divisionid,divisionname from division where divisionid = '" + id + "'", conn);
        conn.Open();
        dt = sql.ExecuteReader(CommandBehavior.SingleRow);
        if (dt.Read())
        {
            DivisionId = id;
            DivisionName = (string)dt["divisionname"];
            Employee = new employee((int)dt["divisionid"]);
        }
        dt.Close();
        conn.Close();
    }
}

//选项2

public class division
{
    public int DivisionId { get; set; }
    public string DivisionName { get; set; }
    public employee Employee { get; set; }

    public class employee
    {
        public int EmpId { get; set; }
        public string EmpName { get; set; }

        public employee()
        {
        }
    }
    public division(int id)
    {
        sql = new SqlCommand("select divisionid,divisionname from division a join employee b on a.divisionid = b.divisionid where a.divisionid = '" + id + "'", conn);
        conn.Open();
        dt = sql.ExecuteReader(CommandBehavior.SingleRow);
        if (dt.Read())
        {
            DivisionId = id;
            DivisionName = (string)dt["divisionname"];
            Employee = new employee();
            Employee.EmpId = (int)dt["empid"];
            Employee.EmpName = (string)dt["empname"];
        }
        dt.Close();
        conn.Close();
    }
}

我想问的问题是,这两个片段中的哪一个表现得更好。

第一种方法,它可以方便地调用类上的每个Attribute,但它需要一个嵌套连接来调用类及其属性。 示例(option1),2往返数据库,第一个是我们调用Division,第二个连接是我们调用Employee的时候。 但每次连接数据库所需的SQL对代码来说非常方便(简单和简短)。

第二种方法,使用连接查询来调用每个部门的员工。 它只需要1次往返数据库,但代码更复杂。

这些示例是嵌套OOP的一种简单形式,但是当相关表很复杂时会发生什么(例如5-6表关系),这意味着我们需要使用连接为每个表进行长而复杂的查询。

1 个答案:

答案 0 :(得分:0)

到数据库的往返是昂贵的,所以第二个选项表现更好。如果您需要联接以更好地执行,请在divisionid表的employee列上添加索引。

现在第二种选择是错误的,也许你没有在这里显示它的最新版本。而不是

sql = new SqlCommand("select divisionid,divisionname from ..

应该是

sql = new SqlCommand("select a.divisionid, divisionname, empid, empname  from ..

你确定该部门只有一名员工吗?