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 }
DBFactory

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 }
T_sqlHelper

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 }
不带参数查询t_Sql

  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
Ok调用存储过程

 

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>了。

折腾了一晚上,如果转载请标明出处!谢谢,码了一晚上也不容易。

 

posted @ 2014-11-08 00:35  Tube  阅读(537)  评论(0)    收藏  举报