.NET三层架构中DAL层的问题,万分感谢大神们解答
/// <summary>
/// 根据课程号取出所有的学生信息
/// </summary>
/// <param name="Cno"></param>
/// <returns></returns>
public List<Object[]> SelectUserByCno(String Cno)
{
List<Object[]> list = new List<Object[]>();
String procName = "procSelectUserByCno";
SqlParameter[] paras = new SqlParameter[]{
new SqlParameter("@Cno",Cno)
};
DataTable dt = sqlHelper.ExecuteQuery(procName,paras,CommandType.StoredProcedure);
Course course = new Course();
course.Cname = (String)dt.Rows[0][0];
User[] users = new User[dt.Rows.Count];
Object[] objects=new object [dt.Rows.Count+1];
objects[0] = course;
for (int i = 0; i < dt.Rows.Count; i++)
{
String temp = (String)dt.Rows[i][1];
users[i] = new User(0,temp,null);
objects[i+1]=users[i];
}
list.Add(objects);
return list;
} 展开
DataTable是原始ADO.net对象,比较简单,弊端是数据没法保留原始类型,在前端绑定时需要转换类型,也没法直接打“.”来调用成员产,简言之,不符合面向对象特征。
所以就有了ORM,对象关系映射,以实现数据表记录本身通常就可以用一个类来描述。一般用LINQ to SQL或EF来实现,如果没有做映射,纯粹手动编写类来描述数据对象,就是所谓的POCO,要做的工作多些,比如从数据库读取数据后手动将表内所有记录实例化为事先定义好的类中,再放入集合,这样在前端打"."即可调用成员,也无需再次转换类型!!
那么问题来了:你的学长让你返回List<>的目的就是希望你返回强类型的对象集合,以便前端更简便调用,以替代你之前返回的DataTable.
但是这个方法的问题就在Object把你辛苦转换好的强类型对象实例又打回原型了,因为再拿出来的时候,还需要再次转换,这就涉及到装箱拆箱,极大影响性能,违背初衷!
解决办法:
必须有合理的实体层(模型层)针对数据库映射,你可选择LINQ to SQL,LinQ to EF来实现,也可以手动写,该实体层必须合理处理好数据关系映射
2.尽量避免无必要的装拆箱,简言之不要在任何类型与object间来回转换,具体概念你百度一下就有
3.使用合理返回类型如:List<Course>
例:
class Course
{
public int ID;
public string Title;
public List<Student> Students;
...
}
class Student
{
public int ID;
public string Name;
...
}
谢谢您的耐心指导!
的基本操作是:给定一个课程编号,查询出选修了这门课的所有人(User)。并将课程以及选修该课程的所有的人,用List<Object[]>返回。
函数内部处理过程如下
1)调用数据中的存储过程procSelectUserByCno,从数据库选取符合条件的记录,放入一个DataTable 中
2)根据 DataTable中的行数量,定义User数组,User[]数组中元素的数量是表的行数dt.Rows.Count
3)定义一个Object数组,数组的第一个元素是Course,后续的对象User。所有Object[]数组的元素的数量是dt.Rows.Count+1
4)逐一处理DataTable中每一行,为对应的User各个属性赋值,然后放入到Object数组中。Object数组的内容为 { course, user1, user2, ……}
5)将Object[] 数组添加到List<Object[]>中并返回
那请问也就是说DataTable中是既有user也有course是吗?
这种方法与直接返回DataTable有什么区别吗?
DataTable 的格式大致是这样的:
----------------------------------------------
课程 选课人信息1 选课人信息2 ……
----------------------------------------------
高数 xxxxx xxxxx
高数 yyyy yyyyy
高数 zzzz zzzzz
…… …… ……
----------------------------------------------
第一个字段是课程。所以,表中的每一行都有“高数”
现在返回的Object[] 为:{ course, user1, user2, …… }。注意:经过处理,只有1个Course了。直接返回DataTable 也是可以的,但DataTable中每行都课程,课程重复多次。所有返回Object[]比较“干练”,返回DataTable比较“臃肿”