288 lines
8.6 KiB
C#
288 lines
8.6 KiB
C#
|
using System;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.Data;
|
|||
|
using System.Linq;
|
|||
|
using System.Reflection;
|
|||
|
using System.Web;
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// DataTableEx 的摘要说明
|
|||
|
/// </summary>
|
|||
|
public static class DataTableEx
|
|||
|
{
|
|||
|
public static List<T> ToList<T>(this DataTable dt) where T : new()
|
|||
|
{
|
|||
|
List<T> ts = new List<T>();
|
|||
|
foreach (DataRow dr in dt.Rows)
|
|||
|
{
|
|||
|
T t = new T();
|
|||
|
foreach (var c in dt.Columns)
|
|||
|
{
|
|||
|
object value = dr[c.ToString()];
|
|||
|
if (value != DBNull.Value)
|
|||
|
{
|
|||
|
var p = t.GetType().GetProperty(c.ToString());
|
|||
|
if (p != null)
|
|||
|
{
|
|||
|
p.SetValue(t, ConvertHelper.ChangeType(value, p.PropertyType), null);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
ts.Add(t);
|
|||
|
}
|
|||
|
return ts;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
public static List<T> ConvertTo<T>(DataTable datatable) where T : new()
|
|||
|
{
|
|||
|
var temp = new List<T>();
|
|||
|
try
|
|||
|
{
|
|||
|
var columnsNames = (from DataColumn dataColumn in datatable.Columns select dataColumn.ColumnName).ToList();
|
|||
|
temp = datatable.AsEnumerable().ToList().ConvertAll<T>(row => GetObject<T>(row, columnsNames));
|
|||
|
return temp;
|
|||
|
}
|
|||
|
catch
|
|||
|
{
|
|||
|
return temp;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
private static T GetObject<T>(DataRow row, List<string> columnsName) where T : new()
|
|||
|
{
|
|||
|
T obj = new T();
|
|||
|
try
|
|||
|
{
|
|||
|
string columnname = "";
|
|||
|
PropertyInfo[] Properties = typeof(T).GetProperties();
|
|||
|
foreach (PropertyInfo objProperty in Properties)
|
|||
|
{
|
|||
|
columnname = columnsName.Find(name => name.ToLower() == objProperty.Name.ToLower());
|
|||
|
if (!string.IsNullOrEmpty(columnname))
|
|||
|
{
|
|||
|
var value = row[columnname];
|
|||
|
if (!string.IsNullOrEmpty(value.ToString()))
|
|||
|
{
|
|||
|
Type type;
|
|||
|
type = Nullable.GetUnderlyingType(objProperty.PropertyType) ?? objProperty.PropertyType;
|
|||
|
objProperty.SetValue(obj,
|
|||
|
type == value.GetType()
|
|||
|
? Convert.ChangeType(value, type)
|
|||
|
: System.Enum.ToObject(type, value), null);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
return obj;
|
|||
|
}
|
|||
|
catch (Exception exception)
|
|||
|
{
|
|||
|
return obj;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 单字段值
|
|||
|
/// </summary>
|
|||
|
/// <returns></returns>
|
|||
|
public static List<string> ToList(this DataTable dt)
|
|||
|
{
|
|||
|
List<string> ts = new List<string>();
|
|||
|
foreach (DataRow dr in dt.Rows)
|
|||
|
{
|
|||
|
foreach (var c in dt.Columns)
|
|||
|
{
|
|||
|
object value = dr[c.ToString()];
|
|||
|
if (value != DBNull.Value)
|
|||
|
{
|
|||
|
ts.Add(value.ToString());
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
return ts;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
public static T ToData<T>(this DataTable dt) where T : new()
|
|||
|
{
|
|||
|
if (dt.Rows.Count > 1)
|
|||
|
{
|
|||
|
throw new Exception("");
|
|||
|
}
|
|||
|
List<T> ts = new List<T>();
|
|||
|
foreach (DataRow dr in dt.Rows)
|
|||
|
{
|
|||
|
T t = new T();
|
|||
|
foreach (var c in dt.Columns)
|
|||
|
{
|
|||
|
object value = dr[c.ToString()];
|
|||
|
if (value != DBNull.Value)
|
|||
|
{
|
|||
|
var p = t.GetType().GetProperty(c.ToString());
|
|||
|
if (p != null)
|
|||
|
{
|
|||
|
p.SetValue(t, ConvertHelper.ChangeType(value, p.PropertyType), null);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
return t;
|
|||
|
}
|
|||
|
return default(T);
|
|||
|
}
|
|||
|
|
|||
|
public static void FillData<T>(this DataTable dt, ref T t) where T : new()
|
|||
|
{
|
|||
|
if (dt.Rows.Count > 1)
|
|||
|
{
|
|||
|
throw new Exception("");
|
|||
|
}
|
|||
|
foreach (DataRow dr in dt.Rows)
|
|||
|
{
|
|||
|
|
|||
|
foreach (var c in dt.Columns)
|
|||
|
{
|
|||
|
object value = dr[c.ToString()];
|
|||
|
if (value != DBNull.Value)
|
|||
|
{
|
|||
|
var p = t.GetType().GetProperty(c.ToString());
|
|||
|
if (p != null)
|
|||
|
{
|
|||
|
p.SetValue(t, ConvertHelper.ChangeType(value, p.PropertyType), null);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// list转化为table
|
|||
|
/// </summary>
|
|||
|
/// <typeparam name="T"></typeparam>
|
|||
|
/// <param name="entitys"></param>
|
|||
|
/// <returns></returns>
|
|||
|
public static DataTable ListToDataTable<T>(List<T> entitys)
|
|||
|
{
|
|||
|
|
|||
|
//检查实体集合不能为空
|
|||
|
if (entitys == null || entitys.Count < 1)
|
|||
|
{
|
|||
|
return new DataTable();
|
|||
|
}
|
|||
|
|
|||
|
//取出第一个实体的所有Propertie
|
|||
|
Type entityType = entitys[0].GetType();
|
|||
|
PropertyInfo[] entityProperties = entityType.GetProperties();
|
|||
|
|
|||
|
//生成DataTable的structure
|
|||
|
//生产代码中,应将生成的DataTable结构Cache起来,此处略
|
|||
|
DataTable dt = new DataTable("dt");
|
|||
|
for (int i = 0; i < entityProperties.Length; i++)
|
|||
|
{
|
|||
|
//dt.Columns.Add(entityProperties[i].Name, entityProperties[i].PropertyType);
|
|||
|
dt.Columns.Add(entityProperties[i].Name);
|
|||
|
}
|
|||
|
|
|||
|
//将所有entity添加到DataTable中
|
|||
|
foreach (object entity in entitys)
|
|||
|
{
|
|||
|
//检查所有的的实体都为同一类型
|
|||
|
if (entity.GetType() != entityType)
|
|||
|
{
|
|||
|
throw new Exception("要转换的集合元素类型不一致");
|
|||
|
}
|
|||
|
object[] entityValues = new object[entityProperties.Length];
|
|||
|
for (int i = 0; i < entityProperties.Length; i++)
|
|||
|
{
|
|||
|
entityValues[i] = entityProperties[i].GetValue(entity, null);
|
|||
|
|
|||
|
}
|
|||
|
dt.Rows.Add(entityValues);
|
|||
|
}
|
|||
|
return dt;
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 查询指定条数分页
|
|||
|
/// </summary>
|
|||
|
/// <returns></returns>
|
|||
|
public static DataTable GetPageToTable(DataTable dt, int StartNum, int EndNum)
|
|||
|
{
|
|||
|
//0页代表每页数据,直接返回
|
|||
|
if (EndNum == 0) return dt;
|
|||
|
//数据源为空返回空DataTable
|
|||
|
if (dt == null) return new DataTable();
|
|||
|
|
|||
|
DataTable newdt = dt.Copy();
|
|||
|
newdt.Clear();//copy dt的框架
|
|||
|
|
|||
|
if (StartNum >= dt.Rows.Count)
|
|||
|
return newdt;//源数据记录数小于等于要显示的记录,直接返回dt
|
|||
|
|
|||
|
if (EndNum > dt.Rows.Count)
|
|||
|
EndNum = dt.Rows.Count;
|
|||
|
for (int i = StartNum; i <= EndNum - 1; i++)
|
|||
|
{
|
|||
|
DataRow newdr = newdt.NewRow();
|
|||
|
DataRow dr = dt.Rows[i];
|
|||
|
foreach (DataColumn column in dt.Columns)
|
|||
|
{
|
|||
|
newdr[column.ColumnName] = dr[column.ColumnName];
|
|||
|
}
|
|||
|
newdt.Rows.Add(newdr);
|
|||
|
}
|
|||
|
return newdt;
|
|||
|
}
|
|||
|
}
|
|||
|
public static class ConvertHelper
|
|||
|
{
|
|||
|
public static object ChangeType(object obj, Type conversionType)
|
|||
|
{
|
|||
|
return ChangeType(obj, conversionType, System.Threading.Thread.CurrentThread.CurrentCulture);
|
|||
|
}
|
|||
|
|
|||
|
public static object ChangeType(object obj, Type conversionType, IFormatProvider provider)
|
|||
|
{
|
|||
|
|
|||
|
#region Nullable
|
|||
|
Type nullableType = Nullable.GetUnderlyingType(conversionType);
|
|||
|
if (nullableType != null)
|
|||
|
{
|
|||
|
if (obj == null)
|
|||
|
{
|
|||
|
return null;
|
|||
|
}
|
|||
|
return Convert.ChangeType(obj, nullableType, provider);
|
|||
|
}
|
|||
|
#endregion
|
|||
|
if (typeof(System.Enum).IsAssignableFrom(conversionType))
|
|||
|
{
|
|||
|
return Enum.Parse(conversionType, obj.ToString());
|
|||
|
}
|
|||
|
return Convert.ChangeType(obj, conversionType, provider);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 分页
|
|||
|
/// </summary>
|
|||
|
/// <returns></returns>
|
|||
|
public static List<T> PageList<T>(List<T> list, out int total, int pageIndex = 1, int pageSize = 10)
|
|||
|
{
|
|||
|
pageIndex = pageIndex - 1;
|
|||
|
total = 0;
|
|||
|
if (list == null || list.Count == 0)
|
|||
|
return list;
|
|||
|
total = list.Count;
|
|||
|
int startIndex = pageIndex * pageSize;
|
|||
|
if (startIndex + pageSize > list.Count)
|
|||
|
{
|
|||
|
pageSize = list.Count - startIndex;
|
|||
|
}
|
|||
|
|
|||
|
if (pageSize <= 0) return new List<T>();
|
|||
|
|
|||
|
return list.GetRange(startIndex, pageSize);
|
|||
|
}
|
|||
|
}
|