.NET三层架构中DAL层的问题,万分感谢大神们解答

course表和user表通过外键连接,以前只接触过返回DataBale的情况,昨天学长说这样写更好,但是理解不了,还想请大神们指教///<summary>///根据课程... course表和user表通过外键连接,以前只接触过返回DataBale的情况,昨天学长说这样写更好,但是理解不了,还想请大神们指教
/// <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;
}
展开
 我来答
学派
2014-11-01 · TA获得超过446个赞
知道小有建树答主
回答量:465
采纳率:100%
帮助的人:260万
展开全部

DataTable是原始ADO.net对象,比较简单,弊端是数据没法保留原始类型,在前端绑定时需要转换类型,也没法直接打“.”来调用成员产,简言之,不符合面向对象特征。


所以就有了ORM,对象关系映射,以实现数据表记录本身通常就可以用一个类来描述。一般用LINQ to SQL或EF来实现,如果没有做映射,纯粹手动编写类来描述数据对象,就是所谓的POCO,要做的工作多些,比如从数据库读取数据后手动将表内所有记录实例化为事先定义好的类中,再放入集合,这样在前端打"."即可调用成员,也无需再次转换类型!!


那么问题来了:你的学长让你返回List<>的目的就是希望你返回强类型的对象集合,以便前端更简便调用,以替代你之前返回的DataTable.


但是这个方法的问题就在Object把你辛苦转换好的强类型对象实例又打回原型了,因为再拿出来的时候,还需要再次转换,这就涉及到装箱拆箱,极大影响性能,违背初衷!


解决办法:

  1. 必须有合理的实体层(模型层)针对数据库映射,你可选择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;

    ...

}

追问
谢谢您的耐心指导!
freeeeeewind
推荐于2016-10-11 · TA获得超过1万个赞
知道大有可为答主
回答量:3227
采纳率:94%
帮助的人:1362万
展开全部
public List<Object[]> SelectUserByCno(String Cno)
的基本操作是:给定一个课程编号,查询出选修了这门课的所有人(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比较“臃肿”
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式