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



//选项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,但它需要嵌套连接来调用类及其属性。示例(选项1),2到数据库的往返,第一个连接是当我们调用Division时,第二个连接是我们调用Employee时。但每次到数据库的连接所需的SQL代码非常方便(简单且更短)。

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

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

到数据库的往返开销很大,所以第二个选项的性能更好。如果需要更好地执行联接,请在employee表的divisionid列上添加索引。

第二个选项现在有点错误,也许你没有在这里显示它的最新版本

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

应该是

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

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

相关内容

最新更新