先上一段代码:public static List<NewCrswClass> GetCrswListByQuery(string[] ids) {
            
            IQueryable<Open_Rs_CrsNew_Rel_Crsw> rel = db.Open_Rs_CrsNew_Rel_Crsw.Where(
                c => ids.Contains(c.NewCrsId.ToString())
                );
            var relList = rel.ToList();
            List<NewCrswClass> list = new List<NewCrswClass>();
            
            foreach (Open_Rs_CrsNew_Rel_Crsw r in relList) {
                
                
                var crswObj = (from crsw in db.Open_Rs_Courseware.Where(c => c.ID == r.CsrwId)
                              select crsw).Single();                NewCrswClass obj = new NewCrswClass() {
                    Id = crswObj.ID,
                    CrswName = crswObj.CrswName,
                    Url = crswObj.CrswUrl,
                    NewCrsName = r.Open_Rs_CourseNew.NewName
                };
                list.Add(obj);
                
            }
            
            return list;
           
        }
比较怪异的是,这段代码运行时好时坏。
如果出问题,就是在中间的foreach部分,提示:指定的转换无效
问题似乎出在这里:读取引用属性public Open_Rs_CrsNew_Rel_Crsw()
{
this._Open_Rs_CourseNew = default(EntityRef<Open_Rs_CourseNew>);
                            //上面这句代码出错
this._Open_Rs_Courseware = default(EntityRef<Open_Rs_Courseware>);
OnCreated();
}
Open_Rs_CourseNew与Open_Rs_Courseware是多对多关系,Open_Rs_CrsNew_Rel_Crsw是中间关联表

解决方案 »

  1.   

    var crswObj = (from crsw in db.Open_Rs_Courseware.Where(c => c.ID == r.CsrwId)
                                  select crsw).Single();
    这句话有问题!
    如果crswObj为空,crswObj.ID,crswObj.CrswName...能用吗?????
      

  2.   

               IQueryable<Open_Rs_CrsNew_Rel_Crsw> rel = db.Open_Rs_CrsNew_Rel_Crsw.Where(
                    c => ids.Contains(c.NewCrsId.ToString())
                    );
                var relList = rel.ToList();
                List<NewCrswClass> list = new List<NewCrswClass>();
                
                foreach (Open_Rs_CrsNew_Rel_Crsw r in relList) {
    这段代码也罗索:
    改下:
    IQueryable<Open_Rs_CrsNew_Rel_Crsw> rel = db.Open_Rs_CrsNew_Rel_Crsw.Where(
                    c => ids.Contains(c.NewCrsId.ToString())
                    );
                List<NewCrswClass> list = new List<NewCrswClass>();
                
                foreach (Open_Rs_CrsNew_Rel_Crsw r in rel ) {
      

  3.   


    public Open_Rs_CrsNew_Rel_Crsw()
            {
                this._Open_Rs_CourseNew = default(EntityRef<Open_Rs_CourseNew>);
                this._Open_Rs_Courseware = default(EntityRef<Open_Rs_Courseware>);
                OnCreated();
            }中的EntityRef<Open_Rs_CourseNew>是什么意思呢?肯定返回的不是_Open_Rs_CourseNew类型的值吧,你考虑一下强制转换。看一看出错不?
      

  4.   


    非常感谢你的回复!这个应该不会有问题,Open_Rs_Courseware是基础数据表,之前的逻辑保证了这句代码取值不会为空。
      

  5.   

    嘻嘻。你看一下EntityRef类的构造。应该这样写吧public Open_Rs_CrsNew_Rel_Crsw() { this._Open_Rs_CourseNew =default(EntityRef<Open_Rs_CourseNew>.Entity); this._Open_Rs_Courseware = default(EntityRef<Open_Rs_Courseware>.Entity); OnCreated(); }
      

  6.   

    是的,就是读取Entity属性的时候出错比较怪异的是,这段代码并不是一直都出错,有时候也是可以读取出数据的,我还没发现规律
      

  7.   

    你看一下相关文档了微软官方的描述是:
    为 LINQ to SQL 应用程序中的一对多关系的单一实例方提供延迟加载和关系维护。
    你这个是多对多吧。可能被延迟加载了吧