.NET MVC+ EF+调用存储过程 多表联查以及VIEW列表显示
直接上干活,至于网上的一大堆处理方式不予评论,做好自己的就是最好的,供大家不走弯路
1、view页面
<link href="~/Content/bootstrap.css" rel="stylesheet" />
<div class="well">
<table class="table">
<tr>
<th>用户名</th>
<th>地址</th>
<th>订单编号</th>
<th>城市代号</th>
<th>时间</th>
<th>订单状态</th>
</tr>
@foreach (var item in ViewBag.dyObject)
{
<tr>
<td>@item.UserName </td>
<td>@item.LocalAddress </td>
<td>@item.BargainOrderCode </td>
<td>@item.CityCode </td>
<td>@item.UpdateTime </td>
<td>@item.OrderStatus </td>
</tr>
}
</table>
</div>
2、Controller 控制器代码
public async Task<ActionResult> UserOrder()
{
#region 使用存储过程实现多表联查VIEW显示 int lastID = ;
int pageSize = ;
SqlParameter[] Param =
{ new SqlParameter("@lastID", System.Data.SqlDbType.Int),
new SqlParameter("@pageSize", System.Data.SqlDbType.Int) }; if (lastID< )
{
Param[].Value = DBNull.Value;
}
else
{
Param[].Value = lastID;
} if (pageSize< )
{
Param[].Value = DBNull.Value;
}
else
{
Param[].Value = pageSize;
} var data = await _DbContext.Exec_SpAsync("SP_GetUserOrderList", Param);
//foreach (Dictionary<string, object> item in data)
//{ // string UserName = item["UserName"].ToString();
// string LocalAddress = item["LocalAddress"].ToString();
// string BargainOrderCode = item["BargainOrderCode"].ToString();
// string CityCode = item["CityCode"].ToString();
// DateTime UpdateTime = Convert.ToDateTime(item["UpdateTime"]);
// int OrderStatus = Convert.ToInt32(item["OrderStatus"]);
//}
List<dynamic> userList = new List<dynamic>(); foreach (Dictionary<string, object> item in data)
{
//userList.Add(new
//{
// UserName = item["UserName"].ToString(),
// LocalAddress = item["LocalAddress"].ToString(),
// BargainOrderCode = item["BargainOrderCode"].ToString(),
// CityCode = item["CityCode"].ToString(),
// UpdateTime =Convert.ToDateTime(item["UpdateTime"]),
// OrderStatus =Convert.ToInt32(item["OrderStatus"]) // }); dynamic dyObject = new ExpandoObject();
dyObject.UserName = item["UserName"].ToString();
dyObject.LocalAddress = item["LocalAddress"].ToString();
dyObject.BargainOrderCode = item["BargainOrderCode"].ToString();
dyObject.CityCode = item["CityCode"].ToString();
dyObject.UpdateTime = Convert.ToDateTime(item["UpdateTime"]);
dyObject.OrderStatus = Convert.ToInt32(item["OrderStatus"]);
userList.Add(dyObject);
}
ViewBag.dyObject = userList;
return View();
#endregion
}
3、EF中多表查询操作的存储过程通用调用方法
/// <summary>
/// 存储共用
/// </summary>
public static class StorageCommon
{
/// <summary>
/// 带有参数的存储过程公共方法 获取信息集合 以及返回空值处理
/// </summary>
/// <param name="db"></param>
/// <param name="sql"></param>
/// <param name="sqlParams"></param>
/// <returns></returns>
public async static Task<ArrayList> Exec_SpAsync(this DefaultDbContext db, string sql, SqlParameter[] sqlParams)
{ using (var cmd = db.Database.Connection.CreateCommand())
{
await db.Database.Connection.OpenAsync();
cmd.CommandText = sql;
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.Parameters.AddRange(sqlParams);
var dr = await cmd.ExecuteReaderAsync();
var columnSchema = dr.GetColumnSchema();
var data = new ArrayList();
while (await dr.ReadAsync())
{
var item = new Dictionary<string, object>();
foreach (var kv in columnSchema)
{
if (kv.ColumnOrdinal.HasValue)
{
var itemVal = dr.GetValue(kv.ColumnOrdinal.Value);
item.Add(kv.ColumnName, itemVal.GetType() != typeof(DBNull) ? itemVal : "");
}
}
data.Add(item);
}
dr.Dispose();
return data;
}
}
完善后代码:
public async static Task<ArrayList> Exec_SpAsync(this DefaultDbContext db, string sql, SqlParameter[] sqlParams)
{
var data = new ArrayList();
DbDataReader dr=null ;
try
{
using (var cmd = db.Database.Connection.CreateCommand())
{
await db.Database.Connection.OpenAsync();
cmd.CommandText = sql;
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.Parameters.AddRange(sqlParams);
//var dr = await cmd.ExecuteReaderAsync();
dr = await cmd.ExecuteReaderAsync();
var columnSchema = dr.GetColumnSchema(); while (await dr.ReadAsync())
{
var item = new Dictionary<string, object>();
foreach (var kv in columnSchema)
{
if (kv.ColumnOrdinal.HasValue)
{
var itemVal = dr.GetValue(kv.ColumnOrdinal.Value);
item.Add(kv.ColumnName, itemVal.GetType() != typeof(DBNull) ? itemVal : "");
}
}
data.Add(item);
}
}
}
catch (Exception ex)
{ _Logger.Error("查询数据" + ex.Message);
//throw new Exception("查询失败." + ex.Message);
}
finally
{
dr.Dispose();
} return data; }
/// <summary>
/// 异步执行带有参数的存储过程公共方法 增删改操作以及返回带有输出的参数
/// </summary>
/// <param name="db"></param>
/// <param name="sql"></param>
/// <param name="sqlParams"></param>
/// <returns></returns>
public async static Task<int> ExecuteNonQueryAsync(this DefaultDbContext db, string sql, SqlParameter[] sqlParams)
{
int numint; using (var cmd = db.Database.Connection.CreateCommand())
{
await db.Database.Connection.OpenAsync();
cmd.CommandText = sql;
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.Parameters.AddRange(sqlParams); numint = await cmd.ExecuteNonQueryAsync();
cmd.Connection.Close();
} return numint;
}
完善后代码: public async static Task<int> ExecuteNonQueryAsync999(this DefaultDbContext db, string sql, SqlParameter[] sqlParams)
{
int numint=;
using (var cmd = db.Database.Connection.CreateCommand())
{
try
{
await db.Database.Connection.OpenAsync();
cmd.CommandText = sql;
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.Parameters.AddRange(sqlParams); numint = await cmd.ExecuteNonQueryAsync();
cmd.Connection.Close(); }
catch (Exception ex)
{
_Logger.Error("执行数据" + ex.Message);
//throw new Exception("提交失败." + ex.Message);
}
finally
{
cmd.Connection.Dispose();
}
return numint; }
}
public class RetCode
{
public const int SUCCESS = ;
public const int ERROR = -; }
public class AsResult
{
private const int STATUS_CODE = 1;
private const string CONTENT_TYPE = "application/json;charset=utf-8";
private readonly static Dictionary<int, string> message = new Dictionary<int, string>()
{
{ RetCode.SUCCESS, "success" },
{ RetCode.ERROR, "" }, }; public static ContentResult Success(Object data = null)
{
var content = new
{
RetCode = RetCode.SUCCESS,
Message = message[RetCode.SUCCESS],
Data = data ?? new { }
};
return new ContentResult
{
//StatusCode = STATUS_CODE,
ContentType = CONTENT_TYPE,
Content = JsonConvert.SerializeObject(content).ToString()
};
} public static ContentResult Error(int code, string moreMsg = "")
{
string msg = "";
if (message.ContainsKey(code))
{
msg = message[code];
}
msg = String.IsNullOrEmpty(msg) ? moreMsg : msg + ", " + moreMsg; var content = new
{
RetCode = code,
Message = msg,
Data = new { }
};
return new ContentResult
{
//StatusCode = STATUS_CODE,
ContentType = CONTENT_TYPE,
Content = JsonConvert.SerializeObject(content).ToString()
};
}
}
}
4、存储过程
CREATE PROCEDURE [dbo].[SP_GetUserOrderList]
( @lastID int=0, --当前页数
@pageSize int=10 --每页显示记录数 ) AS
--declare @rt_code int; --声明变量 BEGIN begin transaction
begin try
BEGIN SELECT DISTINCT top (@pageSize) -- CONVERT(varchar(100), order.UpdateTime, 20) AS UpdateTime
* FROM UserInfo_test usertest
LEFT JOIN TRA_BargainOrder_Test ordertest
ON usertest.Id=ordertest.UserID where (( @lastID > 0 AND usertest.Id < @lastID) OR @lastID=0 )
-- and CONVERT(varchar(100), MB.AddTime, 23)>CONVERT(varchar(100), @StartTime, 23)
--AND CONVERT(varchar(100), MB.AddTime, 23)<CONVERT(varchar(100), @EndTime, 23) ORDER BY ordertest.UpdateTime DESC;
END
commit transaction
end try
---------------------------------------------------------------------------------------------------------------------------- begin catch print '执行存储异常' rollback transaction end catch END GO
.NET MVC+ EF+调用存储过程 多表联查以及VIEW列表显示的更多相关文章
- ASP.NET MVC深入浅出(被替换) 第一节: 结合EF的本地缓存属性来介绍【EF增删改操作】的几种形式 第三节: EF调用普通SQL语句的两类封装(ExecuteSqlCommand和SqlQuery ) 第四节: EF调用存储过程的通用写法和DBFirst模式子类调用的特有写法 第六节: EF高级属性(二) 之延迟加载、立即加载、显示加载(含导航属性) 第十节: EF的三种追踪
ASP.NET MVC深入浅出(被替换) 一. 谈情怀-ASP.NET体系 从事.Net开发以来,最先接触的Web开发框架是Asp.Net WebForm,该框架高度封装,为了隐藏Http的无状态 ...
- ASP.NET MVC + EF 利用存储过程读取大数据,1亿数据测试很OK
看到本文的标题,相信你会忍不住进来看看! 没错,本文要讲的就是这个重量级的东西,这个不仅仅支持单表查询,更能支持连接查询, 加入一个表10W数据,另一个表也是10万数据,当你用linq建立一个连接查询 ...
- 转:EF调用存储过程、函数
EF调用存储过程.函数 2014-04-02 09:12:20| 分类: ORM框架|举报|字号 订阅 一.ef4.1 codeFirst 修改表结构 增加字段等 EF code ...
- ASP.NET MVC + EF 利用存储过程读取大数据
ASP.NET MVC + EF 利用存储过程读取大数据,1亿数据测试很OK 看到本文的标题,相信你会忍不住进来看看! 没错,本文要讲的就是这个重量级的东西,这个不仅仅支持单表查询,更能支持连接查询, ...
- 第四节: EF调用存储过程的通用写法和DBFirst模式子类调用的特有写法
一. 背景 上一个章节,介绍了EF调用两类SQL语句,主要是借助 ExecuteSqlCommand 和 SqlQuery 两个方法来完成,在本章节主要是复习几类存储过程的写法和对应的EF调用这几类 ...
- MVC 5 调用存储过程参数配置方法-Procedure or function 'UP_***' expects parameter '@****', which was not supplied.
MVC 5 调用存储过程参数配置方法-Procedure or function 'UP_***' expects parameter '@****', which was not supplied. ...
- .NET MVC+ EF+通用存储过程实现增删改功能以及使用事物处理
引摘: 1.EF对事务进行了封装:无论何时执行任何涉及Create,Update或Delete的查询,都会默认创建事务.当DbContext类上的SaveChanges()方法被调用时,事务就会提交, ...
- EF调用存储过程、函数
一.ef4.1 codeFirst 修改表结构 增加字段等 EF code first需要重新生成库导致数据丢失的问题 说这个问题前 首先先说下 我使用ef4.1 codefirst的目的. 是因为可 ...
- 关于MVC 中EF调用存储过程
Entity Framework 4.3 中使用存储过程 分类:ASP.NET MVC 3, ASP.NET 0 尽管 Entit ...
随机推荐
- Linux指令范例速查手册
linux命令繁多,命令就是AK的子弹,对上口径,百发百中! 无意发现一本介绍Linux命令的手册--->[Linux指令范例速查手册] 下载: https://pan.baidu.com/s/ ...
- Path画直线与弧线
代码地址如下:http://www.demodashi.com/demo/14754.html 前言 之前讲过Paint和Canvas的基本使用,今天来介绍下Path的使用 涉及内容有: Path画直 ...
- Mybatis 如何自动生成bean dao xml 配置文件 generatorconfig.xml (mysql)
1/自动生成的jar包:mybatis-generator-core-1.3.2.jar 2/generatorconfig.xml文件如: <?xml version="1.0& ...
- git的几个操作
git reference https://git-scm.com/docs 克隆 从远程仓库克隆一个项目到本地文件夹,命令如下:$ git clone https://github.com/libg ...
- php.ini 中文版
作者:金步国 版权声明 本文作者是一位开源理念的坚定支持者,所以本文虽然不是软件,但是遵照开源的精神发布. 无担保:本文作者不保证作品内容准确无误,亦不承担任何由于使用此文档所导致的损失. 自由使用: ...
- Oracle pl/sql导入sql文件,插入更新数据,中文乱码问题解决方案
http://szh-java.iteye.com/blog/1869360 问题描述:用a.sql文件执行insert或update,不论是通过pl/sql还是sqlplus环境下执行,@文件名执行 ...
- Android的API版本和名称对应关系
Android版本名和API Level关系全称 Android的版本 Android版本名称Code name Android的API level Android 1.0 (API level 1) ...
- org.hibernate.exception.ConstraintViolationException: could not insert:
org.hibernate.exception.ConstraintViolationException: could not insert: 报错原由于xxx.hbm.xml文件里的主键类型设置有问 ...
- Python dict 出现 Key error
解决方法: https://www.polarxiong.com/archives/Python-%E6%93%8D%E4%BD%9Cdict%E6%97%B6%E9%81%BF%E5%85%8D%E ...
- Java代码通过API操作HBase的最佳实践
HBase提供了丰富的API.这使得用Java连接HBase非常方便. 有时候大家会使用HTable table=new HTable(config,tablename);的方式来实例化一个HTabl ...