//选项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 ..
你确定这个部门只有一名员工吗?