A是主表
A里面有A1,A2,A3  3个属性B是子表
B里有B1,B2,B3 3个属性其中A1是B2的主键然后我定义了2个实体类,其中B2的属性是这么定义的  private A   _B2;  public A   b2
        {
            get { return _B2; }
            set { _B2 = value; }
        }
然后通过SQL语句,吧SqlDataReader转换成LIST<B>请问SqlDataReader如何成LIST<B>,我在转换的时候总是出现类型不对

解决方案 »

  1.   

    总是在这句话报错 propertyInfo.SetValue(model, reader.GetValue(i), null)
     总是在复制B2的时候说STRING无法转换为B类型,请问这个怎么解决啊
      

  2.   

    public static IList<T> FillList<T>(System.Data.IDataReader reader)  
      {
      IList<T> lst= new List<T>();
      while (reader.Read())
      {
      T RowInstance = Activator.CreateInstance<T>();
      foreach (PropertyInfo Property in typeof(T).GetProperties())
      {
      foreach (BindingFieldAttribute FieldAttr in Property.GetCustomAttributes(typeof(BindingFieldAttribute), true))
      {
      try
      {
      int Ordinal = reader.GetOrdinal(FieldAttr.FieldName);
      if (reader.GetValue(Ordinal) != DBNull.Value)
      {
      Property.SetValue(RowInstance, Convert.ChangeType(reader.GetValue(Ordinal), Property.PropertyType), null);
      }
      }
      catch
      {
      break;
      }
      }
      }
      lst.Add(RowInstance);
      }
      return lst;
      }
      

  3.   

    错误 1 找不到类型或命名空间名称“BindingFieldAttribute”(是否缺少 using 指令或程序集引用?)  
    如何解决
      

  4.   

    我或许会这样去写:while (reader.Read())
    {
        var obj=new B();
        obj.B1=(string)reader["field_b1");
        obj.B2=(A)GetObjectA((long)reader["field_b2"]);
        obj.B3=(DateTime)reader["field_b3"];
        resultList.Add(obj);
    }
    如果要反射来写,那么你可能需要为属性设置一个自定义的Attribute,并且在反射时首先判断
    PropertyInfo上有没有这个Attrobute,如果有就应该根据它的设置(例如使用一个Type加一个string两个参数来说明类似上述GetObjectA那样的方法如何查找到。显然这个B2不可能保存到关系数据库中,正如上面先用一个傻瓜式的例子所说明的,肯定需要调用另一个方法(当反射时就是工厂方法,只不过是根据定义在PropertyInfo上的Attribute来自动寻找方法实例的)来返回对象中的引用其它对象的属性。
      

  5.   

    另外要说明的是,当你自己写ORM的时候要注意,数据库应该是对象最真实的值的表现,它应该对应对象的field而不是property。对象的property则是业务包装,而不是数据库值。不要学linq to sql之类的处理property,它们走不了多远。
      

  6.   

    不要学linq to sql之类的处理property,它们走不了多远。
    ------------------------------------------------
    sp1234老大,我还不会linq,还需要学么?
      

  7.   

    linq是vs2008才有的..呵呵!!我觉得想5楼这样写就好了!!
      

  8.   


    说的是linq to sql 不是linqlinq 非常棒。
      

  9.   

    #5楼的是一种可行方案,
    另一种方案就是创建一个集合(类型应该是LookUp而不是List)来映射两表之间的关系。
      

  10.   

    请问  GetObjectA 是什么啊?
      

  11.   

    为什么 GetObjectA 后面要加LONG啊?
      

  12.   

    吴伟大哥GetObjectA 是什么啊?能否指点一下
      

  13.   

    真强 ,还有人不知道 GetObjectA是什么东东的