当前位置: 代码迷 >> .NET Framework >> []业务实体类初始化时怎么初始化其它的业务实体(多个)
  详细解决方案

[]业务实体类初始化时怎么初始化其它的业务实体(多个)

热度:95   发布时间:2016-05-01 23:33:00.0
[求助]业务实体类初始化时如何初始化其它的业务实体(多个)

public class StudentInfo: StudentBase
    {
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="studID"></param>
        public StudentInfo(string studID):base(studID)
        {
            using(var db = new CetDataBase())
            {
                IQueryable<RegTab> cetInfoQuery = from s in db.RegTab
                              where s.Xh == studID
                              select s;
                foreach (var cetInfo in cetInfoQuery)
                {
  
                }
            }
        }
 
        public string sfzh { get; set; }
 
        public virtual ICollection<CetInfo> CetInfo { get; set; }
    }


测试代码如上,目前还在学习中,也许不一定对,请大家指点,
说明,其中CetInfo 是一个业务实体类,因为一个StudentInfo 可以有多个CetInfo ,请问初始化时,如何给这个ICollection<CetInfo>  CetInfo 初始化 

我本来想通过数据库查询出来的结果给CetInfo 初始化,但查出来的结果是IQueryable<RegTab>类型的,如何转换成ICollection<CetInfo>呢?

或者其它的办法有没有,比如延迟查询,当需要的时候再初始化CetInfo属性,但是到这一步的时候,仍然面临同样的问题,IQueryable<RegTab>如何转换为ICollection<CetInfo>? 


------解决方案--------------------
public virtual ICollection<CetInfo> CetInfo { get; set; }

这里换成IEnumerable 同时建议使用lazy

所以最终就是public virtualI  Lazy<IEnumerable<CetInfo>> CetInfo { get; set; }

你想对他定义就是

CetInfo =()={  //这块对 其进行数据查询工作并返回数据集合} //当然这里是lazy查询所以你甚至可以先把所有外键值完全暂存在一个list里,然后后面一次性查询如内存在根据外键过滤,这个过程类似EF地include


当然所有以上讨论基于你自己去实现他,如果你本身是使用EF地话,这些工作根本不需要你做,EF全会自动帮你完成

------解决方案--------------------
如果你对

         CetInfo= from s in db.RegTab
                               where s.Xh == studID
                               select s;

不满意,你应该使用一个BLL功能方法来封装更有意义的查询操作,而不是乱改什么实体定义。

我确实遇到过自称为研究了“三层”6、7年的人在实体类里乱写数据库查询,这样的人基本上都改行做销售了,而没有做出什么产品。因为一旦做灵活一点的东西,过度单一的模型让他就根本纠结不清了。
  相关解决方案