多层结构应用各层之间数据传递的问题
目前在实验一个3层架构的应用,具体分层如下
1 表示层
2 业务逻辑层
3 数据访问层
对于每个具体的业务模型对象(实体)数据库中会存在一个相应的表,表有多少个字段,那么实体类就有多少个属性
一般情况下,关系数据库中表与表之间都是一定的关联关系的,举个例子,论坛用户和帖子,分别用User,和Post来表示,具体数据库表和实体类结构如下:
User
---------------------------
UserId 唯一标识
LoginId 登录ID
Passwd 密码
NickName 昵称
.....
Post
--------------------------
PostId 唯一标识
Title 标题
CreatedOn 创建日期
CreatedBy 创建者标识(与User的UserId关联)
.....
针多上面的结构,需要查询出某个时间段内所有帖子,并已列表的形式显示.
并且需要在列表中包含用户的昵称(NickName)列,这个很常见的应用。
SQL:
SELECT p.*,u.NickName FROM Post AS p
LEFT JOIN User AS u ON u.UserId=p.CreatedBy
WHERE p.CreatedOn>=@StartDate AND p.CreatedOn<=@EndDate
ORDER BY p.CreatedOn DESC
通过这个SQL查询得到的是一个记录集,而且里面多出了一个NickName属性,而我们的Post实体类中并不包含
NickName这个属性,因为本来也不是应该属于他的属性。这时候我们就没法构建IList<Post>类型的数据集合了。
针对这个问题,我一直没找到好的解决方法。期待高手解惑。。。
目前,因为上面的原因,各层间数据传递的媒介我是采用 实体类,IList<实体类>, DataSet, DataTable结合的方式。
1. 简单获取某个实体对象用实体类
2. 获取记录集合时能够造出实体对象时使用IList<实体类>
3. 获取记录集合时不能够造出实体对象(多个表)时使用DataSet
4. 获取记录集合时不能够造出实体对象(单个表)时使用DataTable
如果都能够传递实体或者实体集合的话就是理想的情况了,这样在表示层就不需知到数据库有什么字段或者说一个查询返回的字段列表了,因为实体是强类型的,表示层需要什么就去访问相关的属性就行了。
如果传回来的是DataSet/DataTable,那么必然要知道数据库中的字段名才能正确地在表示层表示出来。