网站推广平台排行,plc编程培训机构,网站后台编辑器编辑内容无法显示,自己的域名搭建网站背景介绍 在软件开发中肯定免不了和数据库打交道#xff0c;我们对数据的增删改查最终会转化为SQL在数据库中执行。从SQLServer中查出数据一般有两种方式#xff1a;一是ADO.NET直接写SQL语句从数据中查出数据#xff0c;另一种是利用ORM框架得到数据。ADO.NET作为传统的数据…背景介绍 在软件开发中肯定免不了和数据库打交道我们对数据的增删改查最终会转化为SQL在数据库中执行。从SQLServer中查出数据一般有两种方式一是ADO.NET直接写SQL语句从数据中查出数据另一种是利用ORM框架得到数据。ADO.NET作为传统的数据库对接方式现在貌似已经不怎么流行了。让程序员直接写SQL实现增删改查功能存在一定和风险并且在程序中写SQL非常不利于程序的扩展和维护也不利于数据库的维护和更换极大的增加了程序的不稳定性。 其二、利用传统的ADO.NET Datatable的数据操作语法十分繁琐并且装箱拆箱的效率十分低下因此对数据的操作应该使用实体类。那么问题来了对于那些由于各种原因还没有利用起ORM框架但是想利用实体类进行数据操作的程序我们只需要将Datatable中的数据转化为实体类便可实现。废话不多说代码如下所示
public static class DatatableExtension
{/// summary/// 将Datatable转化为指定实体类/// /summary/// typeparam nameT实体类对象类型/typeparam/// param name_sourceTable源DataTable/param/// returns返回转化后的DataTable/returnspublic static ListT ToListT(this DataTable _sourceTable) where T : new(){var resultLists new ListT();var pi typeof(T).GetProperties(BindingFlags.Public|BindingFlags.Instance|BindingFlags.DeclaredOnly).ToList();if (_sourceTable null || pi null || pi.Count 0){//DataTable为null或实体类无属性则返回空的实体类}else{var wildColumnsLists new Liststring();//用于存放无法找到对应实体类属性的列,无后续操作var piFlagLists new ListTuplePropertyInfo, bool();//用于存放找到对应实体类属性的列二元组T1是列的数据类型T2是类型是否和实体类是否相等foreach (DataColumn col in _sourceTable.Columns){if (pi.Exists(p p.Name.Equals(col.ColumnName))){var prop pi.FirstOrDefault(q q.Name.Equals(col.ColumnName));piFlagLists.Add(Tuple.Create(prop, prop.PropertyType.Equals(col.DataType)));}else{wildColumnsLists.Add(col.ColumnName);}}foreach (DataRow dr in _sourceTable.Rows){T targetEntity new T();foreach (var piFlag in piFlagLists){if (piFlag.Item1.SetMethod ! null !piFlag.Item1.PropertyType.IsGenericType !dr.IsNull(piFlag.Item1.Name)){//赋值操作,如类型不相同则以实体类为准并赋值piFlag.Item1.SetValue(targetEntity, piFlag.Item2 ? dr[piFlag.Item1.Name] : Convert.ChangeType(dr[piFlag.Item1.Name], piFlag.Item1.PropertyType));}else{//无法赋值的情况1、set访问器不存在2、此属性为泛型3、Datatable中招不到需要转换的列名}}resultLists.Add(targetEntity);}}return resultLists;}/// summary/// 将筛选后的Datatable转化为指定实体类/// /summary/// typeparam nameT/typeparam/// param name_sourceTable源DataTable/param/// param name_predicate执行筛选的委托/param/// returns返回执行筛选转化后的DatatTable/returnspublic static ListT ToListT(this DataTable _sourceTable, FuncDataRow, bool _predicate) where T : new(){var whereDT _sourceTable.Where(_predicate);return whereDT.ToListT();}/// summary/// 在Datatable中使用Where方法进行筛选/// /summary/// param name_sourceTable源DataTable/param/// param name_whereFunc执行筛选的委托/param/// returns筛选后的DataTable/returnspublic static DataTable Where(this DataTable _sourceTable, FuncDataRow, bool _predicate){if (_sourceTable null){throw new ArgumentNullException(nameof(_sourceTable));}else{if (_predicate null){return _sourceTable;}else{var rowLists _sourceTable.AsEnumerable().Where(_predicate);var resultDataTable rowLists.Count() 0 ? _sourceTable.Clone() : rowLists.CopyToDataTable();return resultDataTable;}}}/// summary/// 在Datatable中调用Select方法进行选取/// /summary/// typeparam nameT选取结果类型/typeparam/// param name_sourceTable源Datatable/param/// param name_selector执行委托/param/// returns/returnspublic static ListT SelectT(this DataTable _sourceTable, FuncDataRow, T _selector){if (_sourceTable null){throw new ArgumentNullException(nameof(_sourceTable));}else{if (_selector null){throw new ArgumentNullException(nameof(_sourceTable));}else{var resultLsit _sourceTable.AsEnumerable().Select(_selector).ToList();return resultLsit;}}}/// summary/// 直接在当前DataTable对象上调用Any方法进行判断/// /summary/// param name_dt当前DataTable变量/param/// param name_anyFunc执行Any方法的委托/param/// returns结果true代表有元素满足条件false 代表没有元素满足条件/returnspublic static bool Any(this DataTable _dt, FuncDataRow, bool _predicate){if (null ! _dt null ! _predicate){var reuslt _dt.AsEnumerable().Any(_predicate);return reuslt;}else{throw new ArgumentNullException(string.Format({0}|{1}, null _dt ? nameof(_dt) : string.Empty, null _predicate ? nameof(_predicate) : string.Empty));}}/// summary/// DataTable的ForEach扩展方法/// /summary/// param name_dt当前dt/param/// param name_action要执行的委托/parampublic static void ForEach(this DataTable _dt, ActionDataRow _action){if (null _dt){throw new ArgumentNullException(nameof(_dt));}if (null _action){throw new ArgumentNullException(nameof(_action));}_dt.AsEnumerable().ToList().ForEach(row _action(row));}/// summary/// 获取当前DataTable对象的满足委托条件的第一个datarow/// /summary/// param name_dt/param/// param name_predicate/param/// returns/returnspublic static DataRow FirstOrDefault(this DataTable _dt, FuncDataRow, bool _predicate){if (null _predicate){throw new ArgumentNullException(nameof(_predicate));}return _dt.AsEnumerable().FirstOrDefault(_predicate);}/// summary/// 获取当前DataTable对象的满足委托条件最后一个datarow/// /summary/// param name_dt/param/// param name_predicate/param/// returns/returnspublic static DataRow LastOrDefault(this DataTable _dt, FuncDataRow, bool _predicate){if (null _predicate){throw new ArgumentNullException(nameof(_predicate));}return _dt.AsEnumerable().LastOrDefault(_predicate);}
} 在DatatableExtension类中前两个两个扩展方法一个是方法直接将Datatable转化为指定的实体类第二个方法支持将Datatable进行委托筛选后转化为指定实体类操作代码如下图所示
string sql string.Format(SELECT A.UserID ,A.UserName ,A.UserPwd ,FROM dbo.TabUsers AS A );
DataSet ds dbhelp.JustGetData(sql);//查询出sql语句对应的数据
ListTabUser UserLists ds.Tables[0].ToListTabUser();//将DataTable转化为TabUser实体类
ListTabUser easyUserLists ds.Tables[0].ToListTabUser(p p[UserName].ToString().Contains(车间));//筛选出UserName包含“车间”字段的数据public class TabUser:EntityBase
{public string UserName { get; set; }public string UserPwd { get; set; }public long UserID { get; set; }
}