DataTable 與 實體之間相互轉換
一: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;
}
測試:
[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], "張三");
}
}
相關推薦
DataTable 與 實體之間相互轉換
一:ConvertDataTableToModel: 主要將DataTable中改動的內容同步到實體類集合中 /// <summary> /// 將DB中改動的內容同步到泛型集合中 /// </summary>
C# DataTable 和List之間相互轉換的方法
dbn execute 屬性 ins 集合 方法 summary efault getprop 一、List<T>/IEnumerable轉換到DataTable/DataView private DataTable ToDataTable<T>(
PHP陣列與物件之間相互轉換
/** * 陣列 轉 物件 * * @param array $arr 陣列 * @return object */ function ar
base64編碼與圖片之間相互轉換
Base64是網路上最常見的用於傳輸8Bit位元組碼的編碼方式之一 一、將base64轉換成圖片 只需要在img 標籤中引入即可,注意要加上標明字首(data:image/png;base64),否則並不知道,這串程式碼是幹啥的 如: 二、將圖片轉換成base64 通過ca
ASP.NET中DataTable與DataSet之間的轉換
DataSet包含了多個DataTable,以及DataTable之間的約束關係。 如果你的資料不需要做關係對映,直接用DataTable效率比較高。如果有需要1:N或N:M這樣的關係查詢,將DataSet中的相應DataTable全部填充,再使用關係查詢資料。 Dat
XStream實現javabean與xml之間相互轉換
XStream是thoughtworks公司釋出的一個簡單的Java類庫,用於將JavaBean序列化為XML,並且能夠將XML檔案反向轉換為JavaBean. 例項: user.java impor
datatable與實體類之間相互轉化的幾種方法
#region DataTable轉換成實體類 /// <summary> /// 填充物件列表:用DataSet的第一個表填充實體類 /// </summary> /// <
js時間戳與日期格式之間相互轉換
時間日期 TP var gets nbsp unix時間 其他 value nds 時間戳:是一種時間表示方式,定義為從格林威治時間1970年01月01日00時00分00秒起至現在的總秒數。Unix時間戳不僅被使用在Unix系統、類Unix系統中,也在許多其他操作系統中被
xml檔案和DataTable之間相互轉換
using System.Xml; using System.Xml.Serialization; /// <summary> /// 下面兩個方法實現xml
Xml字串與C#物件之間相互轉換
我們常常需要讀取xml檔案,把裡面的資訊轉化為我們自定義的型別,或則吧自定義型別轉化為Xml字串。在這裡介紹一個比較簡單的物件轉化方法。在我自己的Framwork裡面也多次用到。裡面涉及到節點、屬性、集合。 示例一 該xml檔案涉及到屬性、節點集合不涉及個節點: <?x
Android px、dp、sp之間相互轉換
系統 als 屏幕大小 span ava 不同 text 自動 nal dp(dip): device independent pixels(設備獨立像素). 不同設備有不同的顯示效果,這個和設備硬件有關,一般我們為了支持WVGA、HVGA和QVGA 推薦使用這個,不依
RGB與HSV之間的轉換公式及顏色表
bsp 公式 blog log b- size 分享 ont idt RGB & HSV 英文全稱 RGB - Red, Green, Blue HSV - Hue, Saturation, Value HSV --> RGB 轉換公式 HSV --&g
Android 單位dp和px之間相互轉換
style pan static float logs ati col return roi public class DensityUtil { /** * 根據手機的分辨率從 dp 的單位 轉成為 px(像素) */
C與C++之間相互調用
end att toolbar 處理 處理器 執行文件 客戶 c語言項目 title http://www.cnblogs.com/luxiaoxun/p/3405374.html 1、導出C函數以用於C或C++的項目 如果使用C語言編寫的DLL,希望從中導出函數給C或C+
ArcMap中使用ArcPy實現Geometry與WKT的相互轉換
bottom ast 我們 python 函數 == 其它 相關 圖形 在Web GIS迅猛發展的今天,使用瀏覽器來進行交互以其方便性、快捷性被廣大用戶所推崇,那麽在傳輸格式方面,都已比較簡單的JSON或者WKT來解決網絡帶寬帶來的數據壓力。在ArcGIS10.2版本號
jQuery添加添加時間與時間戳相互轉換組件
get parse col cse [0 typeof 相互 兼容 min 時間與時間戳的格式相互轉換(轉換主要兼容ie8,ie8不支持new Date()) (function($) { $.extend({ myTime: {
[轉]python str與bytes之間的轉換
color eth bsp nat alter .com http log com 原文:http://www.cnblogs.com/zqifa/p/python-7.html # bytes object b = b"example" # str object
【PowerShell】ASCII與Char之間的轉換
clas cnblogs class pan bsp 之間 power code log 1 [char[]][int[]]$char=65..90 2 $char -join ‘,‘ 3 [int[]][char[]]$ascii=$char 4 $ascii -joi
關於js中的json對象,json串,數組之間相互轉換
obj oca color 轉換成 之間 str 關於 blog spa 將json對象轉換成string var loginUser = {username: username, password: password}//方式一 localStorage.setItem
JQ與JS的相互轉換
-s 轉換 由於 spa () col $() 互轉 dom對象 $()函數是JQ對象的制造工廠,或者講JQ對象都是由此函數生成的。 1、在JQ對象變量名前加$,格式: var $變量名=JQ對象; 在dom對象變量名前不加$,格式: var 變量名=JS對象; 例如: v