亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

多年前寫的DataTable與實體類的轉換

2019-11-14 13:50:06
字體:
來源:轉載
供稿:網友

介紹

介紹

很多年前一直使用Ado.net,后來慢慢轉型到其他的orm,在轉型過程中,有意向將兩者的模型結合起來,利用DataTable中的行狀態完善一些mvc中的數據控制作用?,F在把它放出來,留個紀念。

起因

很多年前,對Ado.net這塊了解較深,當時公司也有一套框架,將Ado.net做成了ORMapping,所以,當時對DataTable的操作很是熟練。

 DataTable中的行狀態很好的和界面的數據后者操作進行了關聯,比如新增,修改,取消,刪除等,都能在DataTable中的行狀態對應起來,然后那個orm框架就自動根據不同的行狀態生成sql語句,也是比較方便。

   后來,技術一直在進步,也使用過EF,使用過java移植過來的Nhibernate,這樣對實體類的操作越來越多,當時就產生了這樣一個想法,界面綁定DataTable,然后數據的變動通過這些新的orm工具持久化起來,于是就做了這個工具類。

代碼

  因為是工具類,代碼結構比較簡單。如圖:

 

 

 

TransformUtil工具類主要就3個方法。

一:ConvertDataTableToModel:

主要將DataTable中改動的內容同步到實體類集合中

/// <summary>        /// 將DB中改動的內容同步到泛型集合中        /// </summary>        /// <typeparam name="T">類型</typeparam>        /// <param name="source">dt源</param>        /// <param name="destinationArray">目標Model集合</param>        /// <returns></returns>        public static bool ConvertDataTableToModel<T>(DataTable source, List<T> destinationArray)            where T : class        {            if (source == null || destinationArray == null || source.PRimaryKey == null || source.PrimaryKey.Count() <= 0)                return false;            DataTable dtChange = source.GetChanges();            if (dtChange == null)                return false;            List<string> keys = new List<string>();            foreach (var item in source.PrimaryKey)            {                keys.Add(item.ColumnName);            }            return ConvertDataTableToModel(source, destinationArray, keys);        }
二:ConvertDataTableToModel重載:
/// <summary>        /// 同步table里改動的數據到泛型集合里去(新增,修改,刪除)        /// </summary>        /// <typeparam name="T">類型</typeparam>        /// <param name="source">dt源</param>        /// <param name="destinationArray">目標Model集合</param>        /// <param name="keyColumnArray">主鍵集合</param>        /// <returns></returns>        public static bool ConvertDataTableToModel<T>(DataTable source, List<T> destinationArray, List<string> keyColumnArray)             where T : class        {            if (source == null || destinationArray == null || source.Rows.Count == 0 || keyColumnArray == null || keyColumnArray.Count == 0)                return false;            Type modeType = destinationArray.GetType().GetGenericArguments()[0];//模型類型            PropertyInfo[] ppInfoArray = modeType.GetProperties();//公共屬性集合            List<PropertyInfo> listPPInfo = ppInfoArray.ToList();//方便查詢            //關鍵列            List<PropertyInfo> keyPIArray = listPPInfo.FindAll(x => keyColumnArray.Contains(x.Name));            List<T> listToDelete = new List<T>();            //新增的數據            DataRow[] drAddArray = source.Select("", "", DataViewRowState.Added);            object objItem = modeType.Assembly.CreateInstance(modeType.FullName);            foreach (DataRow dr in drAddArray)            {                destinationArray.Add((T)objItem);                foreach (System.Reflection.PropertyInfo pi in listPPInfo)                {                    pi.SetValue(destinationArray[destinationArray.Count - 1], dr[pi.Name], null);                }            }            //修改和刪除的數據            DataView dvForOP = new DataView(source);            dvForOP.RowStateFilter = DataViewRowState.Deleted | DataViewRowState.ModifiedCurrent;            foreach (DataRowView drv in dvForOP)            {                for (int i = 0; i < destinationArray.Count; i++)                {                    bool blIsTheRow = true;                    //找出關鍵列對應的行                    foreach (System.Reflection.PropertyInfo pInfo in keyPIArray)                    {                        object okey = pInfo.GetValue(destinationArray[i], null);                        if (okey == null)                            continue;                        if (drv[pInfo.Name].ToString() != okey.ToString())                        {                            blIsTheRow = false;                            break;                        }                    }                    if (!blIsTheRow)//非本行                        continue;                    //根據行狀態同步賦值                    switch (drv.Row.RowState)                    {                        case DataRowState.Modified:                            {                                foreach (System.Reflection.PropertyInfo pi in listPPInfo)                                {                                    if (keyPIArray.Contains(pi))//主鍵列不更新                                        continue;                                    pi.SetValue(destinationArray[i], drv[pi.Name], null);                                }                            } break;                        case DataRowState.Deleted:                            {                                listToDelete.Add(destinationArray[i]);                            } break;                    }                }            }            for (int i = 0; i < listToDelete.Count; i++)            {                destinationArray.Remove(listToDelete[i]);            }            return true;        }

三:ConvertModelToDataTable:

將實體類集合轉成DataTable。其中params這個參數比較有意思,大家可以去查下。

/// <summary>        /// 將泛型集合類轉換成DataTable        /// </summary>        /// <typeparam name="T">集合項類型</typeparam>        /// <param name="sourceArray">集合</param>        /// <param name="propertyNameArray">需要返回的列的列名,如需返回所有列,此參數傳入null值</param>        /// <returns>數據集(表)</returns>        public static DataTable ConvertModelToDataTable<T>(IList<T> sourceArray, params string[] propertyNameArray)            where T:class        {            List<string> propertyNameList = new List<string>();            if (propertyNameArray != null)                propertyNameList.AddRange(propertyNameArray);            DataTable result = new DataTable();            //獲取結構            Type[] typeArr = sourceArray.GetType().GetGenericArguments();            if (typeArr.Length == 0)                return result;            PropertyInfo[] propertys = typeArr[0].GetProperties();            foreach (PropertyInfo pi in propertys)            {                if (propertyNameList.Count == 0)                {                    result.Columns.Add(pi.Name, pi.PropertyType);                }                else                {                    if (propertyNameList.Contains(pi.Name))                        result.Columns.Add(pi.Name, pi.PropertyType);                }            }            for (int i = 0; i < sourceArray.Count; i++)            {                ArrayList tempList = new ArrayList();                foreach (PropertyInfo pi in propertys)                {                    if (propertyNameList.Count == 0)                    {                        object obj = pi.GetValue(sourceArray[i], null);                        tempList.Add(obj);                    }                    else                    {                        if (propertyNameList.Contains(pi.Name))                        {                            object obj = pi.GetValue(sourceArray[i], null);                            tempList.Add(obj);                        }                    }                }                object[] array = tempList.ToArray();                result.LoadDataRow(array, true);            }            return result;        }

四:ConvertDataViewToModel:

將Dataview中所以內容轉成實體。

/// <summary>        /// 將視圖轉換成泛型集合        /// </summary>        /// <typeparam name="T">類型</typeparam>        /// <param name="dataView">視圖</param>        /// <param name="model">泛型實例</param>        /// <returns></returns>        public static List<T> ConvertDataViewToModel<T>(DataView dataView, T model)            where T:class        {            List<T> listReturn = new List<T>();            Type modelType = model.GetType();            DataTable dt = dataView.Table;            //獲取model所有類型            PropertyInfo[] modelProperties = modelType.GetProperties();            //遍歷所有行,逐行添加對象            for (int i = 0; i < dt.Rows.Count; i++)            {                object obj = modelType.Assembly.CreateInstance(modelType.FullName);                listReturn.Add((T)obj);                //遍歷model所有屬性                foreach (PropertyInfo pi in modelProperties)                {                    //遍歷所有列                    foreach (DataColumn col in dt.Columns)                    {                        //如果列數據類型與model的數據類型相同、名稱相同                        if (col.DataType == pi.PropertyType                            && col.ColumnName == pi.Name)                        {                            pi.SetValue(obj, dt.Rows[i][col.ColumnName], null);                        }                    }                }            }            return listReturn;        }

UnitTest

這次的UntTest比較簡單,覆蓋率也不是100%,都快12點了,得休息了,就簡單的弄了2個測試方法。如下:

[TestMethod]        public void TestConvertDataTableToModel()        {            DataTable dt = new DataTable();            dt.Columns.Add("Id", typeof(string));            dt.Columns.Add("Name", typeof(string));            dt.Columns.Add("Address", typeof(string));            dt.PrimaryKey = new DataColumn[] { dt.Columns[0] };            dt.Rows.Add("0001", "張三", "武漢市");            dt.Rows.Add("0002", "李四", "北京市");            dt.AcceptChanges();            dt.Rows.Add("0003", "王五", "深圳市");            List<People> allPeople = new List<People>();            TransformUtil.ConvertDataTableToModel<People>(dt, allPeople);            //斷言是不是只有一個數據,平且是只是修改狀態的王五這個人            Assert.AreEqual(allPeople.Count, 1);            Assert.AreEqual(allPeople[0].Name, "王五");        }
[TestMethod]        public void TestConvertModelToDataTable()        {            List<People> allPeople = new List<People>()            {              new People(){ Id="0001", Name="張三", Address ="武漢市"},              new People(){ Id="0002", Name="李四", Address ="北京市"},              new People(){ Id="0003", Name="王五", Address ="深圳市"}            };            DataTable dt = TransformUtil.ConvertModelToDataTable<People>(allPeople, null);            //斷言是不是有3行數據,數據的列有3列,第1列是不是Id,第一行第二列是不是張三            Assert.AreEqual(dt.Rows.Count, 3);            Assert.AreEqual(dt.Columns.Count, 3);            Assert.AreEqual(dt.Columns[0].ColumnName, "Id");            Assert.AreEqual(dt.Rows[0][1], "張三");        }    }

測試結果如下:

兩個測試用例均通過。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美成人激情视频| 亚洲人免费视频| 按摩亚洲人久久| 日韩国产高清污视频在线观看| 亚洲成人黄色网址| 亚洲深夜福利网站| 久久久久国色av免费观看性色| 国产一区二区黑人欧美xxxx| 欧美第一黄网免费网站| 在线观看久久久久久| 久久久久久久国产精品视频| 国产欧美日韩免费看aⅴ视频| 麻豆精品精华液| 亚洲成人久久久| 5566日本婷婷色中文字幕97| 欧美成人免费在线视频| 日韩毛片在线看| 久久成人综合视频| 久久国产精品影视| 国产精品草莓在线免费观看| 国产精品久久久久久久午夜| 日韩精品视频在线观看网址| 欧美电影在线免费观看网站| 精品久久香蕉国产线看观看gif| 国产精品久久一区主播| 久久久久久国产三级电影| 日韩中文字幕在线视频| 久久精品国产电影| 伊人亚洲福利一区二区三区| 国产精品吹潮在线观看| 日韩国产欧美精品在线| 日本中文字幕成人| 亚洲九九九在线观看| 日韩hd视频在线观看| 黑人巨大精品欧美一区二区三区| 国产亚洲一区精品| 亚洲午夜av电影| 亚洲欧洲午夜一线一品| 97在线免费视频| 538国产精品一区二区在线| 国产成人久久久| 欧美成人激情视频| 国产精品久久久久久久久久久不卡| 国产亚洲精品综合一区91| 欧美精品videos| 欧美精品激情在线| 好吊成人免视频| 国产男女猛烈无遮挡91| 97久久精品在线| 96精品久久久久中文字幕| 91成品人片a无限观看| 国产一区二区三区久久精品| 日韩av一区在线观看| 九九精品在线播放| 国产精品久久久久久久久久免费| 91日韩在线播放| 韩曰欧美视频免费观看| 青草热久免费精品视频| 久久影视电视剧免费网站| 成人网在线视频| 海角国产乱辈乱精品视频| 青青久久av北条麻妃黑人| 色琪琪综合男人的天堂aⅴ视频| 亚洲精品aⅴ中文字幕乱码| 日韩精品高清在线观看| 欧美亚洲国产日本| 国产精品中文字幕在线观看| 亚洲国产精品电影| 亚洲成人在线视频播放| 亚洲精品中文字| 国产aⅴ夜夜欢一区二区三区| 亚洲成色www8888| 97超碰色婷婷| 亚洲美女性视频| yellow中文字幕久久| 91日韩在线视频| 亚洲九九九在线观看| 成人精品久久一区二区三区| 中文字幕日韩欧美精品在线观看| 中文字幕日韩在线播放| 国内外成人免费激情在线视频| 久久久精品一区| 91精品国产免费久久久久久| 亚洲国产欧美一区二区三区同亚洲| 欧美日韩在线视频观看| 亚洲精品自产拍| 精品五月天久久| 欧美极品美女视频网站在线观看免费| 国产精品久久久久av| 国产精品久久久久久中文字| 精品久久久久久中文字幕大豆网| 亚洲精品电影在线观看| 欧美日韩999| 国产精品视频中文字幕91| 日韩午夜在线视频| 性欧美xxxx视频在线观看| 欧美黑人xxxⅹ高潮交| 久久国产精品久久精品| 欧美激情欧美激情在线五月| 中文字幕亚洲精品| 欧美国产极速在线| 欧美亚洲成人网| 亚洲国产日韩欧美在线99| 日韩在线视频网| 91免费福利视频| 日韩欧美亚洲范冰冰与中字| 国产精品欧美日韩一区二区| 国产美女91呻吟求| 日韩中文字幕在线视频播放| 成人免费看片视频| 992tv成人免费视频| 91天堂在线视频| 一本一本久久a久久精品综合小说| 国产欧美婷婷中文| 96精品久久久久中文字幕| 欧美精品手机在线| 欧美又大又硬又粗bbbbb| 国产精品夫妻激情| 成人日韩在线电影| 日韩大胆人体377p| 亚洲成色777777女色窝| 91久久精品日日躁夜夜躁国产| 亚洲欧美制服另类日韩| 91免费综合在线| 亚洲在线www| 日韩欧美中文字幕在线播放| 欧美激情亚洲综合一区| 欧美成人免费大片| 亚洲精品成人av| 精品调教chinesegay| 欧美亚洲免费电影| 久久久日本电影| 91夜夜揉人人捏人人添红杏| 成人精品视频在线| 欧美日韩在线一区| 国产精品青草久久久久福利99| 国产成人精品久久二区二区91| 中文字幕欧美亚洲| 欧美成人h版在线观看| 国产国语videosex另类| 国产免费亚洲高清| 久久久成人的性感天堂| 欧美中文在线字幕| 国产日韩欧美中文在线播放| 久久露脸国产精品| 亚洲福利在线视频| 国产精品免费视频久久久| 亚洲欧洲成视频免费观看| 亚洲人成毛片在线播放| 色阁综合伊人av| 成人免费高清完整版在线观看| 九九热最新视频//这里只有精品| 国产精品青青在线观看爽香蕉| 成人午夜激情免费视频| 国产精品∨欧美精品v日韩精品| 成人欧美在线视频| 久久久久久亚洲精品中文字幕| 亚洲第一福利视频| 2019中文字幕全在线观看| 高清在线视频日韩欧美| 欧美精品一区二区免费| 欧美激情一区二区三区成人| 国产香蕉一区二区三区在线视频| 亚洲乱码国产乱码精品精|