SqlDataReader怎样生成动态Lambda表达式
发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,这篇文章主要介绍SqlDataReader怎样生成动态Lambda表达式,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!在对SqlServer返回的流对象 SqlDataRead
千家信息网最后更新 2026年10月31日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安全错误
数据库的锁怎样保障安全
云之行互联网科技
互联网科技工作委员会主任
互联网科技活动banner
互联网下的科技发展
世界互联网领先科技成果
未来的互联网科技
百单互联网科技有限公司
互联网科技上市公司
易通互联网络科技有限公司
顺玮阁互联网科技
互联网金融和金融科技
恒生科技互联网指数分析
青海省互联网新科技
千方科技属于互联网企业吗
高科技互联网套路
互联网领先科技宣传片
本届互联网大会上的黑科技
艺电能源互联网科技有限公司招聘
互联网科技的前景
黑龙江互联网科技公司
互联网科技公司起名
互联网的科技
互联网科技卖菜
互联网未来科技
远信互联网科技
亿账通互联网科技
须眉科技是互联网公司吗
宜昌元轩互联网科技有限公司
领航科技大厦互联网公司
宁波跨境商互联网科技有限公司