博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
执行存储过程返回游标集合转换成List
阅读量:6161 次
发布时间:2019-06-21

本文共 3680 字,大约阅读时间需要 12 分钟。

  最近在项目中使用了Entity Framework 4.1,语句查询全部都是用Linq和Lambda表达式完成,但是有几个页面查询比较复杂,用到了多个条件汇总和列值的判断,如果用Linq来写语句相当复杂,还未必能实现想要的结果,最终只能选择Oracle的存储过程来完成,因为需要传入参数执行查询返回结果集。

  在使用EF调用执行存储过程获取游标集合,试验琢磨了几天也未能实现,最终只能采取.Net的客户端驱动或者OleDb连接Oracle实现存储过程的调用,最终获取到的集合也只能是DataSet或者DataTable,还必须要转换成实体对象List<>。

  存储过程执行方法:

View Code
1 ///    2         /// 执行存储过程   3         ///    4         /// 存储过程名   5         /// 存储过程参数   6         /// DataSet结果中的表名   7         /// 
DataSet
8 public static DataSet RunProcedure(string storedProcName, IDataParameter[] parameters, string tableName) 9 {10 using (OracleConnection connection = new OracleConnection(connectionString))11 {12 DataSet dataSet = new DataSet();13 connection.Open();14 OracleDataAdapter sqlDA = new OracleDataAdapter();15 sqlDA.SelectCommand = BuildQueryCommand(connection, storedProcName, parameters);16 sqlDA.Fill(dataSet, tableName);17 connection.Close();18 return dataSet;19 }20 }

  DataTable转换List方法:

View Code
1 class ConvertHelper
where T : new() 2 { 3 ///
4 /// 利用反射和泛型 5 /// 6 ///
7 ///
8 public static List
ConvertToList(DataTable dt) 9 { 10 11 // 定义集合 12 List
ts = new List
(); 13 14 // 获得此模型的类型 15 Type type = typeof(T); 16 //定义一个临时变量 17 string tempName = string.Empty; 18 //遍历DataTable中所有的数据行 19 foreach (DataRow dr in dt.Rows) 20 { 21 T t = new T(); 22 // 获得此模型的公共属性 23 PropertyInfo[] propertys = t.GetType().GetProperties(); 24 //遍历该对象的所有属性 25 foreach (PropertyInfo pi in propertys) 26 { 27 tempName = pi.Name;//将属性名称赋值给临时变量 28 //检查DataTable是否包含此列(列名==对象的属性名) 29 if (dt.Columns.Contains(tempName)) 30 { 31 // 判断此属性是否有Setter 32 if (!pi.CanWrite) continue;//该属性不可写,直接跳出 33 //取值 34 object value = dr[tempName]; 35 //如果非空,则赋给对象的属性 36 if (value != DBNull.Value) 37 pi.SetValue(t, value, null); 38 } 39 } 40 //对象添加到泛型集合中 41 ts.Add(t); 42 } 43 44 return ts; 45 46 } 47 }

  调用存储过程:

View Code
1 public List
selSum(string startDate,string endDate) 2 { 3 OracleParameter[] parms = { 4 new OracleParameter("P_YBQJ_S",OracleType.VarChar,6), 5 new OracleParameter("P_YBQJ_E",OracleType.VarChar,6), 6 new OracleParameter("RESULT_CUR",OracleType.Cursor) 7 }; 8 parms[0].Value = startDate; 9 parms[1].Value = endDate;10 parms[2].Direction = ParameterDirection.Output;11 DataSet DS = OraHelper.RunProcedure("PRO_LJHZ", parms, "DS");12 List
list1 = ConvertHelper
.ConvertToList(DS.Tables[0]);13 return list1;14 }

 

有没有高手知道EF调用存储过程的方法,在此指导一下!

欢迎各路高手在此留下脚印,共同探讨与分享~~~

 

转载于:https://www.cnblogs.com/ZHF/archive/2012/07/19/2599325.html

你可能感兴趣的文章
GWT用frame调用JSP
查看>>
大型高性能ASP.NET系统架构设计
查看>>
insert select带来的问题
查看>>
EasyUI 添加tab页(iframe方式)
查看>>
mysqldump主要参数探究
查看>>
好记心不如烂笔头,ssh登录 The authenticity of host 192.168.0.xxx can't be established. 的问题...
查看>>
使用addChildViewController手动控制UIViewController的切换
查看>>
Android Fragment应用实战
查看>>
SQL Server查询死锁并KILL
查看>>
内存或磁盘空间不足,Microsoft Office Excel 无法再次打开或保存任何文档。 [问题点数:20分,结帖人wenyang2004]...
查看>>
委托到Lambda的进化: ()=> {} 这个lambda表达式就是一个无参数的委托及具体方法的组合体。...
查看>>
apache 伪静态 .htaccess
查看>>
unity3d 截屏
查看>>
ASP.NET MVC学习之控制器篇
查看>>
MongoDB ServerStatus返回信息
查看>>
分析jQuery源码时记录的一点感悟
查看>>
程序局部性原理感悟
查看>>
UIView 动画进阶
查看>>
Spring如何处理线程并发
查看>>
linux常用命令(用户篇)
查看>>