EF执行T_sql语句存储过程helper封装及测试调用源码
刚开始接触EF也不知这么写会有什么问题,望大神指导、调教。
1.创建DbContextFatcay创建DbContext保证线程内唯一(这代码网上一堆,我也是从网上找的)
1 using System; 2 using System.Collections.Generic; 3 using System.Data.Entity; 4 using System.Linq; 5 using System.Runtime.Remoting.Messaging; 6 using System.Text; 7 8 namespace EF_Model.DBSql 9 { 10 public static class DBFactory 11 { 12 public static DbContext CreateDbContext { get { return GetcurrentDbContect(); } } 13 private static DbContext GetcurrentDbContect() 14 { 15 DbContext db = (DbContext)CallContext.GetData("DbContext"); 16 if (db == null) 17 { 18 db = new HoganDBEntities(); 19 CallContext.SetData("DbContext", db); 20 } 21 return db; 22 } 23 } 24 }
2.创建t_sqlHelper【执行t_sql语句】我抽出了三个方法代码如下:
1 using System; 2 using System.Collections.Generic; 3 using System.Data.Entity; 4 using System.Linq; 5 using System.Text; 6 using System.Data; 7 8 namespace EF_Model.DBSql 9 { 10 public class DBSQlHelper 11 { 12 HoganDBEntities db = (HoganDBEntities)DBFactory.CreateDbContext; 13 14 /// <summary> 15 /// 只可查询Entity类型的实体EF必须有此类型实体 16 /// </summary> 17 /// <typeparam name="T"></typeparam> 18 /// <param name="sql"></param> 19 /// <param name="pms"></param> 20 /// <returns></returns> 21 public IList<T> GetEntity<T>(string sql, params object[] pms) where T : class,new() 22 { 23 return db.Set<T>().SqlQuery(sql, pms).ToList(); 24 25 } 26 27 /// <summary> 28 /// 执行非EntityFormark实体类型数据 29 /// </summary> 30 /// <typeparam name="T"></typeparam> 31 /// <param name="sql"></param> 32 /// <param name="pms"></param> 33 /// <returns></returns> 34 public IList<T> GetNoEntity<T>(string sql, params object[] pms) where T : class,new() 35 { 36 return db.Database.SqlQuery<T>(sql, pms).ToList(); 37 } 38 39 /// <summary> 40 /// 执行新增、修改、删除时使用返回受影响的行数 41 /// </summary> 42 /// <param name="sql"></param> 43 /// <param name="pms"></param> 44 /// <returns></returns> 45 public int SqlCommand(string sql, params object[] pms) 46 { 47 return db.Database.ExecuteSqlCommand(sql, pms); 48 } 49 } 50 }
3.开始测试使用了
3.1执行普通查询语句
1 DBSQlHelper helper = new DBSQlHelper(); 2 // 3 // GET: /Home/ 4 5 public ActionResult Index() 6 { 7 #region 调用t_sql语句 8 var t_sql = "select top 14 * from usergroup"; 9 IList<UserGroup> t_sqllist = helper.GetEntity<UserGroup>(t_sql); 10 11 ////string s = ""; 12 ////foreach (var item in t_sqllist) 13 ////{ 14 //// s += item.ugCreateUnickName + ","; 15 ////} 16 #endregion 17 }
3.2调用带参数的sql语句[表连接查询]
由于连接实体不需要两张表的所有字段,而EF实体类(数据库表字段不够)我创建了一个新的实体,为我少写字段我直接继承EF的实体代码如下:
1 /// <summary> 2 /// 与用户组表关联后查询结果实体 3 /// </summary> 4 public class UsersView : Users 5 { 6 public string ugCreateUnickName { get; set; } 7 public string ugName { get; set; } 8 public string ugInfo { get; set; } 9 }
1 var t_Sql = @" 2 select u.*,ug.ugCreateUnickName,ug.ugName,ug.ugInfo from UserGroup as ug 3 right join users as u 4 on ug.ugId=u.ugId 5 where userid>@userid 6 order by userid desc 7 "; 8 //此方法 只能调用EF中有的类型[数据库中有实体表] 9 //IList<UsersView> uvList= helper.GetEntity<UsersView>(t_Sql, new SqlParameter("@userid", 1)); 10 11 // IEnumerable<UsersView> uvList = helper.GetNoEntity<UsersView>(t_Sql, new SqlParameter("@userid", 1)); 12 13 SqlParameter p1 = new SqlParameter("@userid", 1); 14 IEnumerable<UsersView> uvList = helper.GetNoEntity<UsersView>(t_Sql, p1); 15 int count = uvList.Count();
3.3调用存储过程【先来个错误的例子】
1 #region 错误的写法 调用存储过程 2 3 //@prows_ int, 4 //@pages_ int, 5 //@wheres_ varchar(1000), 6 //@orders_ varchar(200) 7 var query = "exec GetUserGroupList @prows_,@pages_,@wheres_,@orders_"; 8 IList<UserGroup> list = helper.GetEntity<UserGroup>(query, 50, 1, " ugid>3840517 ", " ugid ASC "); 9 #endregion
以下我是写了个分页的存储过程及调用代码
1 #region Ok调用存储过程 2 var query = "exec GetUserGroupList @prows_,@pages_,@wheres_,@orders_"; 3 SqlParameter[] pms = new SqlParameter[] { 4 new SqlParameter("@prows_",System.Data.SqlDbType.Int){ Value=50}, 5 new SqlParameter("@pages_",1), 6 new SqlParameter("@wheres_"," ugid>3840517 "), 7 new SqlParameter("@orders_"," ugid ASC ") 8 }; 9 IList<UserGroup> list = helper.GetEntity<UserGroup>(query, pms); 10 #endregion
4.附问题一个【t_sqlHelper】问题代码如下:
1 /// <summary> 2 /// 执行非EntityFormark实体类型数据 3 /// </summary> 4 /// <typeparam name="T"></typeparam> 5 /// <param name="sql"></param> 6 /// <param name="pms"></param> 7 /// <returns></returns> 8 public IEnumerable<T> GetNoEntity<T>(string sql, params object[] pms) where T : class,new() 9 { 10 return db.Database.SqlQuery<T>(sql, pms); 11 }

原因是SqlParameter原有的参数没有Clear(),我也不知道在那里清空参数。就只有在t_sqlHelper中直接ToList()没有返回IEnumerable<T>了。
折腾了一晚上,如果转载请标明出处!谢谢,码了一晚上也不容易。

浙公网安备 33010602011771号