SqlDataReader怎样生成动态Lambda表达式
发表于:2025-01-16 作者:千家信息网编辑
千家信息网最后更新 2025年01月16日,这篇文章主要介绍SqlDataReader怎样生成动态Lambda表达式,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!在对SqlServer返回的流对象 SqlDataRead
千家信息网最后更新 2025年01月16日SqlDataReader怎样生成动态Lambda表达式
这篇文章主要介绍SqlDataReader怎样生成动态Lambda表达式,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
在对SqlServer返回的流对象 SqlDataReader 进行处理,也采用动态生成Lambda表达式的方式转换实体。
先上一版代码
using System;using System.Collections.Generic;using System.Data;using System.Data.Common;using System.Data.SqlClient;using System.Linq;using System.Linq.Expressions;using System.Reflection;using System.Text;using System.Threading.Tasks;namespace Demo1{ public static class EntityConverter { #region ////// DataTable生成实体 /// ////// /// public static List ToList (this DataTable dataTable) where T : class, new() { if (dataTable == null || dataTable.Rows.Count <= 0) throw new ArgumentNullException("dataTable", "当前对象为null无法生成表达式树"); Func func = dataTable.Rows[0].ToExpression (); List collection = new List (dataTable.Rows.Count); foreach (DataRow dr in dataTable.Rows) { collection.Add(func(dr)); } return collection; } /// /// 生成表达式 /// ////// /// public static Func ToExpression (this DataRow dataRow) where T : class, new() { if (dataRow == null) throw new ArgumentNullException("dataRow", "当前对象为null 无法转换成实体"); ParameterExpression parameter = Expression.Parameter(typeof(DataRow), "dr"); List binds = new List (); for (int i = 0; i < dataRow.ItemArray.Length; i++) { String colName = dataRow.Table.Columns[i].ColumnName; PropertyInfo pInfo = typeof(T).GetProperty(colName); if (pInfo == null || !pInfo.CanWrite) continue; MethodInfo mInfo = typeof(DataRowExtensions).GetMethod("Field", new Type[] { typeof(DataRow), typeof(String) }).MakeGenericMethod(pInfo.PropertyType); MethodCallExpression call = Expression.Call(mInfo, parameter, Expression.Constant(colName, typeof(String))); MemberAssignment bind = Expression.Bind(pInfo, call); binds.Add(bind); } MemberInitExpression init = Expression.MemberInit(Expression.New(typeof(T)), binds.ToArray()); return Expression.Lambda >(init, parameter).Compile(); } #endregion /// /// 生成lambda表达式 /// ////// /// public static Func ToExpression (this SqlDataReader reader) where T : class, new() { if (reader == null || reader.IsClosed || !reader.HasRows) throw new ArgumentException("reader", "当前对象无效"); ParameterExpression parameter = Expression.Parameter(typeof(SqlDataReader), "reader"); List binds = new List (); for (int i = 0; i < reader.FieldCount; i++) { String colName = reader.GetName(i); PropertyInfo pInfo = typeof(T).GetProperty(colName); if (pInfo == null || !pInfo.CanWrite) continue; MethodInfo mInfo = reader.GetType().GetMethod("GetFieldValue").MakeGenericMethod(pInfo.PropertyType); MethodCallExpression call = Expression.Call(parameter, mInfo, Expression.Constant(i)); MemberAssignment bind = Expression.Bind(pInfo, call); binds.Add(bind); } MemberInitExpression init = Expression.MemberInit(Expression.New(typeof(T)), binds.ToArray()); return Expression.Lambda >(init, parameter).Compile(); } }}
在上一篇的基础上增加了 SqlDataReader 的扩展方法
以下代码是调用
using System;using System.Collections.Generic;using System.Data;using System.Data.Common;using System.Data.SqlClient;using System.Diagnostics;using System.Linq;using System.Reflection;using System.Text;using System.Threading.Tasks;namespace Demo1{ class Program { static void Main(string[] args) { String conString = "Data Source=.; Initial Catalog=master; Integrated Security=true;"; Funcfunc = null; List usrs = new List (); using (SqlDataReader reader = GetReader(conString, "select object_id 'ID',name 'Name' from sys.objects", CommandType.Text, null)) { while (reader.Read()) { if (func == null) { func = reader.ToExpression (); } Usr usr = func(reader); usrs.Add(usr); } } usrs.Clear(); Console.ReadKey(); } public static SqlDataReader GetReader(String conString, String sql, CommandType type, params SqlParameter[] pms) { SqlConnection conn = new SqlConnection(conString); SqlCommand cmd = new SqlCommand(sql, conn); cmd.CommandType = type; if (pms != null && pms.Count() > 0) { cmd.Parameters.AddRange(pms); } conn.Open(); return cmd.ExecuteReader(CommandBehavior.CloseConnection); } } class Usr { public Int32 ID { get; set; } public String Name { get; set; } }}
以上是"SqlDataReader怎样生成动态Lambda表达式"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!
生成
表达式
对象
动态
实体
代码
内容
篇文章
上一
价值
兴趣
基础
小伙
小伙伴
方式
方法
更多
知识
行业
资讯
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
如何防范家庭网络安全做法
天津服务器维修调试虚拟主机
数据库数据查询操作题
昌平区网络技术咨询优点
常用软件开发框架
数据库系统简明教程答案
app软件开发背景
瓷砖软件开发公司
奉贤区上门软件开发咨询报价
达梦数据库怎么做
浙江推广网络技术多少钱
校招 软件开发 面试
dnf服务器迁移教程
系统软件开发流程管理软件
软件开发招聘最高工资
数据库有哪五部分
网络安全领域名人
校园网络安全整治总结
上海服务器漏洞招投标
职场互联网科技
廊坊燕郊软件开发招聘信息
上海工业软件开发大概要多少钱
数据库学习入门书籍下载
广州访客管理软件开发哪家好
csl 网络安全法
如何在服务器里用指令获得钱
mysql远程数据库连接
软件开发投标服务方案
摩客软件开发
软件开发erp方向是做什么