SqlDataReader怎样生成动态Lambda表达式
发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,这篇文章主要介绍SqlDataReader怎样生成动态Lambda表达式,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!在对SqlServer返回的流对象 SqlDataRead
千家信息网最后更新 2025年11月07日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;"; Func func = 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安全错误
数据库的锁怎样保障安全
网络安全技术期末论文
数据库创建表的图片
数据库表格生效命令
省鑫泽网络技术有限公司
跨平台工业实时数据库
编码器软件开发
无名逝者数据库
现代通信网络技术演讲
打开服务器管理器-点击功能
小米手机服务器怎么下
ovid数据库怎么进去
服务器的网络分配
智能家居app软件开发流程
软件开发的边界管理成功的项目
战地5怎样寻找服务器
新中大 服务器连接
江西省网络安全法专场竞赛答案
数据库相关的黑话
金蝶服务器怎么设置
小学网络安全课视频下载
欧盟网络安全战略发布
有计算机网络技术的搜题软件吗
sql可以软件开发吗
酒泉网络安全工程师和程序员
b75支持服务器内存吗
刀片式服务器 显示器
HCNA网络技术期末考试
淄博新网互联网科技有限公司
软件开发团队需要几个人
北京修哪儿互联网科技有限公