表達式讀取 DataReader 表達式 Get Set 表達式賦值,取值

這幾天對表達式進行了學習,有了初步瞭解.現在 製作 了一個可以讀取DataReader的動態表達式,用於替換反射讀取數據


----取值

   

    /// <summary>
    /// 取值表達式測試
    /// </summary>
    /// <param name="expr"></param>
    public Func<M_Ask, int> 取一個屬性值()
    {
        Expression<Func<M_Ask, int>> expr = p => p.Id;

        return expr.Compile();
    }
    public Func<T, ValT> 取一個屬性值表達式版<T, ValT>(T obj, string propertyName)
    {
        //定義一個參數 p
        var p = Expression.Parameter(typeof(T), "p");
        //定義一個屬性如 p.id
        var val = Expression.PropertyOrField(p, propertyName);
        //p=>p.id
        //LambdaExpression xxx = Expression.Lambda(val, p);
        //Delegate res=    xxx.Compile();

        //p=>p.id
        Expression<Func<T, ValT>> func = Expression.Lambda<Func<T, ValT>>(val, p);

        return func.Compile();
    }

表達式賦值

    void dxxdd()
    {
        Func<bookcc, IDataReader, string> ddd = (e, r) => (e.bookname = r.GetString(0));
    }


DataReader賦值(不能讀取int?這種數據)

/// <summary>
    /// 獲取指定索引的數據並且返回調用委託
    /// </summary>
    /// <typeparam name="T">實體類類型</typeparam>
    /// <typeparam name="T1">結果類型</typeparam>
    /// <param name="index">當前對應在DataReader中的索引</param>
    /// <param name="ProPertyName">對應實體類屬性名</param>
    /// <param name="FieldType">字段類型</param>
    /// <returns>返回通過調用的委託</returns>
    public Action<T, IDataRecord> SetValueToEntity<T>(int index, string ProPertyName, Type FieldType)
    {
        Type datareader = typeof(IDataRecord);
        var Mdthods = datareader.GetMethods().Where(p => p.ReturnType == FieldType && p.Name.StartsWith("Get") && p.GetParameters().Where(n => n.ParameterType == typeof(int)).Count() == 1);
        //獲取調用方法
        System.Reflection.MethodInfo Method = null;
        if (Mdthods.Count() > 0)
        {
            Method = Mdthods.FirstOrDefault();
        }
        else
        {
            throw new EntryPointNotFoundException("沒有從DataReader找到合適的取值方法");
        }
        ParameterExpression e = Expression.Parameter(typeof(T), "e");
        ParameterExpression r = Expression.Parameter(datareader, "r");
        //常數表達式
        ConstantExpression i = Expression.Constant(index);
        MemberExpression ep = Expression.PropertyOrField(e, ProPertyName);
        MethodCallExpression call = Expression.Call(r, Method, i);



        //instance.Property = value 這名話是重點
        BinaryExpression assignExpression = Expression.Assign(ep, call);
        var ex = Expression.Lambda(assignExpression, e, r);

        Expression<Action<T, IDataRecord>> resultEx = Expression.Lambda<Action<T, IDataRecord>>(assignExpression, e, r);
        Action<T, IDataRecord> result = resultEx.Compile();

        return result;
    }


從DataReader填充實體對像集合

    public List<T> 從DataReader獲取數據值<T>()
        where T : new()
    {
        List<T> result = new List<T>();

        IDataReader reader = null;
        System.Data.SqlClient.SqlConnection conn = null;
        try
        {
            //查詢DataReader
            reader = tong.SqlDataReader("select  * from book", out conn);
            Dictionary<int, DataColumn> columnDics = new Dictionary<int, DataColumn>();
            //表達式字典委託 
            Dictionary<int, Action<T, IDataReader>> actionDics = new Dictionary<int, Action<T, IDataReader>>();
            //生成表頭
            for (int i = 0; i < reader.FieldCount; i++)
            {
                DataColumn col = new DataColumn()
                {
                    ColumnName = reader.GetName(i),
                    DataType = reader.GetFieldType(i),
                    Namespace = reader.GetDataTypeName(i)
                };
                //添加列
                columnDics.Add(i, col);
                //獲取字典值
                actionDics.Add(i, SetValueToEntity<T>(i, col.ColumnName, col.DataType));
            }

            //查詢讀取項
            while (reader.Read())
            {
                T objT = new T();
                //添加到集合
                result.Add(objT);

                //填充屬性值
                foreach (var item in actionDics)
                {
                    //判斷字段是否爲null
                    if (!reader.IsDBNull(item.Key))
                    {
                        //設置屬性值
                        item.Value(objT, reader);
                    }
                    else
                    {
                        //null處理
                    }
                }
            }


        }
        finally
        {
            if (reader != null)
            {

                reader.Close();
                reader.Dispose();
            }
            if (conn != null)
            {
                conn.Close();
                conn.Dispose();
            }
        }

        return result;
    }


實體類定義 


#region 實體類
    /// <summary>
    /// book:實體類(屬性說明自動提取數據庫字段的描述信息)
    /// </summary>
    [Serializable]
    protected class bookcc
    {

        #region Model
        private decimal _bookid;
        private string _mch;
        private string _pp;
        private string _qch;
        private string _jj;
        private string _rq;
        private string _jg;
        private string _zl;
        private string _xx;
        private string _isbn1;
        private string _tp;
        private string _nr;
        private string _ml;
        private string _bookname;
        private string _pingpai;
        private string _bookchuban;
        private string _bookdate;
        private string _kaiben;
        private int _yeshu;
        private int _banci;
        private string _zhuang;
        private string _isbn;
        private string _bookcontent;
        private string _bookmulu;
        private decimal _pingji;
        private decimal _shichangjia;
        private decimal _huiyuanjia;
        private decimal _vipjia;
        private int _bestbook;
        private int _tejiabook;
        private int _newsbook;
        private int _kucun;
        private int _chengjiaocount;
        private int _liulancount;
        private int _dazhe;
        private int _nclassid;
        private int _anclassid;
        private string _bookpic;
        private string _bookzz;

        private int _pingjizong;
        private string _shjianame;
        private int _shjiaid;
        /// <summary>
        /// 
        /// </summary>
        public decimal bookid
        {
            set { _bookid = value; }
            get { return _bookid; }
        }
        /// <summary>
        /// 
        /// </summary>
        public string mch
        {
            set { _mch = value; }
            get { return _mch; }
        }
        /// <summary>
        /// 
        /// </summary>
        public string pp
        {
            set { _pp = value; }
            get { return _pp; }
        }
        /// <summary>
        /// 
        /// </summary>
        public string qch
        {
            set { _qch = value; }
            get { return _qch; }
        }
        /// <summary>
        /// 
        /// </summary>
        public string jj
        {
            set { _jj = value; }
            get { return _jj; }
        }
        /// <summary>
        /// 
        /// </summary>
        public string rq
        {
            set { _rq = value; }
            get { return _rq; }
        }
        /// <summary>
        /// 
        /// </summary>
        public string jg
        {
            set { _jg = value; }
            get { return _jg; }
        }
        /// <summary>
        /// 
        /// </summary>
        public string zl
        {
            set { _zl = value; }
            get { return _zl; }
        }
        /// <summary>
        /// 
        /// </summary>
        public string xx
        {
            set { _xx = value; }
            get { return _xx; }
        }
        /// <summary>
        /// 
        /// </summary>
        public string isbn1
        {
            set { _isbn1 = value; }
            get { return _isbn1; }
        }
        /// <summary>
        /// 
        /// </summary>
        public string tp
        {
            set { _tp = value; }
            get { return _tp; }
        }
        /// <summary>
        /// 
        /// </summary>
        public string nr
        {
            set { _nr = value; }
            get { return _nr; }
        }
        /// <summary>
        /// 
        /// </summary>
        public string ml
        {
            set { _ml = value; }
            get { return _ml; }
        }
        /// <summary>
        /// 
        /// </summary>
        public string bookname
        {
            set { _bookname = value; }
            get { return _bookname; }
        }
        /// <summary>
        /// 
        /// </summary>
        public string pingpai
        {
            set { _pingpai = value; }
            get { return _pingpai; }
        }
        /// <summary>
        /// 
        /// </summary>
        public string bookchuban
        {
            set { _bookchuban = value; }
            get { return _bookchuban; }
        }
        /// <summary>
        /// 
        /// </summary>
        public string bookdate
        {
            set { _bookdate = value; }
            get { return _bookdate; }
        }
        /// <summary>
        /// 
        /// </summary>
        public string kaiben
        {
            set { _kaiben = value; }
            get { return _kaiben; }
        }
        /// <summary>
        /// 
        /// </summary>
        public int yeshu
        {
            set { _yeshu = value; }
            get { return _yeshu; }
        }
        /// <summary>
        /// 
        /// </summary>
        public int banci
        {
            set { _banci = value; }
            get { return _banci; }
        }
        /// <summary>
        /// 
        /// </summary>
        public string zhuang
        {
            set { _zhuang = value; }
            get { return _zhuang; }
        }
        /// <summary>
        /// 
        /// </summary>
        public string isbn
        {
            set { _isbn = value; }
            get { return _isbn; }
        }
        /// <summary>
        /// 
        /// </summary>
        public string bookcontent
        {
            set { _bookcontent = value; }
            get { return _bookcontent; }
        }
        /// <summary>
        /// 
        /// </summary>
        public string bookmulu
        {
            set { _bookmulu = value; }
            get { return _bookmulu; }
        }
        /// <summary>
        /// 
        /// </summary>
        public decimal pingji
        {
            set { _pingji = value; }
            get { return _pingji; }
        }
        /// <summary>
        /// 
        /// </summary>
        public decimal shichangjia
        {
            set { _shichangjia = value; }
            get { return _shichangjia; }
        }
        /// <summary>
        /// 
        /// </summary>
        public decimal huiyuanjia
        {
            set { _huiyuanjia = value; }
            get { return _huiyuanjia; }
        }
        /// <summary>
        /// 
        /// </summary>
        public decimal vipjia
        {
            set { _vipjia = value; }
            get { return _vipjia; }
        }
        /// <summary>
        /// 
        /// </summary>
        public int bestbook
        {
            set { _bestbook = value; }
            get { return _bestbook; }
        }
        /// <summary>
        /// 
        /// </summary>
        public int tejiabook
        {
            set { _tejiabook = value; }
            get { return _tejiabook; }
        }
        /// <summary>
        /// 
        /// </summary>
        public int newsbook
        {
            set { _newsbook = value; }
            get { return _newsbook; }
        }
        /// <summary>
        /// 
        /// </summary>
        public int kucun
        {
            set { _kucun = value; }
            get { return _kucun; }
        }
        /// <summary>
        /// 
        /// </summary>
        public int chengjiaocount
        {
            set { _chengjiaocount = value; }
            get { return _chengjiaocount; }
        }
        /// <summary>
        /// 
        /// </summary>
        public int liulancount
        {
            set { _liulancount = value; }
            get { return _liulancount; }
        }
        /// <summary>
        /// 
        /// </summary>
        public int dazhe
        {
            set { _dazhe = value; }
            get { return _dazhe; }
        }
        /// <summary>
        /// 
        /// </summary>
        public int nclassid
        {
            set { _nclassid = value; }
            get { return _nclassid; }
        }
        /// <summary>
        /// 
        /// </summary>
        public int anclassid
        {
            set { _anclassid = value; }
            get { return _anclassid; }
        }
        /// <summary>
        /// 
        /// </summary>
        public string bookpic
        {
            set { _bookpic = value; }
            get { return _bookpic; }
        }
        /// <summary>
        /// 
        /// </summary>
        public string bookzz
        {
            set { _bookzz = value; }
            get { return _bookzz; }
        }
        /// <summary>
        /// 
        /// </summary>
        public DateTime adddate
        {
            get;
            set;
        }
        /// <summary>
        /// 
        /// </summary>
        public int pingjizong
        {
            set { _pingjizong = value; }
            get { return _pingjizong; }
        }
        /// <summary>
        /// 
        /// </summary>
        public string shjianame
        {
            set { _shjianame = value; }
            get { return _shjianame; }
        }
        /// <summary>
        /// 
        /// </summary>
        public int shjiaid
        {
            set { _shjiaid = value; }
            get { return _shjiaid; }
        }
        #endregion Model

    }
    #endregion




使用方法

        //填充數據
        var list = 從DataReader獲取數據值<bookcc>();

























發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章