Entity Framework 6 Recipes 2nd Edition(10-2)译 -> 返回输出参数
10-2. 返回输出参数
问题
想获取存储过程里的一个或多个输出参数的值
解决方案
假设我们有一个像Figure 10-1所示的,出租车辆与租金收入的模型

Figure 10-1.出租车辆与租金收入的模型
我们想知道在指定日期里,收入了几笔租金和金额, 以及车辆的租凭情况. 存储过程Listing 10-7 就是获取这些信息的.
Listing 10-7. A Stored Procedure for the Vehicles Rented, the Number of Rentals, and the Total Rental Payments
create procedure [chapter10].[GetVehiclesWithRentals]
(@date date,
@TotalRentals int output,
@TotalPayments decimal(18,2) output)
as
begin
select @TotalRentals = COUNT(*), @TotalPayments = SUM(payment)
from chapter10.Rental
where RentalDate = @date
select distinct v.*
from chapter10.Vehicle v join chapter10.Rental r
on v.VehicleId = r.VehicleId
end
为了在模型里使用空上存储过程,执行以下操作:
1. 右击模型的设计视图,选择“从数据库更新模型”. 在对话框里
,选择存储过程GetVehiclesWithRentals. 点击“完成”添加存储过程到模型里。
2. 右击模型的设计视图, 选择“新增”➤“函数导入”. 在“存储过程/函数名称(P):”下拉框里选择
GetVehiclesWithRentals,在“函数导入名称(F):”里输入GetVehiclesWithRentals (这个就是在模型里生成的方法名称)。在“返回以下内容的集合”里勾选“实体”,并从下拉列里选择Vehicle
.点击“确定”
3.下面的Listing 10-8 就是使用GetVehiclesWithRentals的方法.
Listing 10-8.通过GetVehiclesWithRentals() 方法使用模型里的GetVehiclesWithRentals存储过程
staticvoid Main(string[] args)
{
using (var context = newEFRecipesEntities())
{
context.Database.ExecuteSqlCommand("delete from chapter10.Rental");
context.Database.ExecuteSqlCommand("delete from chapter10.Vehicle");
var car1 = newVehicle { Manufacturer = "Toyata", Model = "Camry", Year = 2013 };
var car2 = newVehicle { Manufacturer = "Chevrolet", Model = "Corvette", Year = 2013 };
var r1 = newRental { Vehicle = car1, RentalDate = DateTime.Parse("5/7/2013"), Payment = 59.95m };
var r2 = newRental { Vehicle = car2, RentalDate = DateTime.Parse("5/7/2013"), Payment = 139.95m };
car1.Rentals.Add(r1);
car2.Rentals.Add(r2);
context.Vehicles.Add(car1);
context.Vehicles.Add(car2);
context.SaveChanges();
}
using (var context = newEFRecipesEntities())
{
string reportDate = "5/7/2013";
var totalRentals = newObjectParameter("TotalRentals", typeof(int));
var totalPayments = newObjectParameter("TotalPayments", typeof(decimal));
var vehicles = context.GetVehiclesWithRentals(DateTime.Parse(reportDate),
totalRentals, totalPayments);
Console.WriteLine("Retal Activity for {0}", reportDate);
Console.WriteLine("Vehicles Rented");
foreach (var vehicle in vehicles)
{
Console.WriteLine("{0} {1} {2}", vehicle.Year, vehicle.Manufacturer, vehicle.Model);
}
Console.WriteLine("TotalRentals:{0}", (int)totalRentals.Value);
Console.WriteLine("Total Payments:{0}", ((decimal)totalPayments.Value).ToString("C"));
Console.WriteLine("\npress any key to exit...");
Console.ReadKey();
}
}
以下Listing 10-8是控制台输出结果:
===================================================================
Rental Activity for 5/7/2013
Vehicles Rented
2013 Toyota Camry
2013 Chevrolet Corvette
Total Rentals: 2
Total Payments: $200.00
===========================================
它是如何工作的?
第2步操作会使用GetVehiclesWithRentals存储过程更新模型 ,我们也更新了概念模型,让存储过程暴露在GetVehiclesWithRentals()上,该方法与存储过程有着类似的签名.
有一点请注意:当调用GetVehiclesWithRentals()方法后,它返回的实体集必须先实例化,输出参数才可以用。这跟ADO.NET里的DataReader相似,DataReader必须必执行NextResult(),才能读取到数据。同样地,实体集必须被访问或是处理之后,输出参数里才能有输出值。
在我们例子里, 当我们实例化第一个vehicle后,输出参数还不可以用,如果我们把输出payments和rentals总和的代码(Console.WriteLine("TotalRentals:{0}", (int)totalRentals.Value);Console.WriteLine("Total Payments:{0}",((decimal)totalPayments.Value).ToString("C"));)移动到foreach循环里,执行到这里的时候,会产生异常(totalRentals.Value和totalPayments.Value为null). 另一种解决办法是:我们把实体类集用ToList()方法实例化之后,然后循环实例化后的实体集. 这样我们也就可以在foreach循环里使用这两个输出参数的输出值了。
totalPayments
Entity Framework 6 Recipes 2nd Edition(10-2)译 -> 返回输出参数的更多相关文章
- Entity Framework 6 Recipes 2nd Edition 译 -> 目录 -持续更新
因为看了<Entity Framework 6 Recipes 2nd Edition>这本书前面8章的翻译,感谢china_fucan. 从第九章开始,我是边看边译的,没有通读,加之英语 ...
- Entity Framework 6 Recipes 2nd Edition(9-1)译->用Web Api更新单独分离的实体
第九章 在N层结构的应用程序中使用EF 不是所有的应用都能完全地写入到一个单个的过程中(就是驻留在一个单一的物理层中),实际上,在当今不断发展的网络世界,大量的应用程序的结构包含经典的表现层,应用程, ...
- Entity Framework 6 Recipes 2nd Edition(9-3)译->找出Web API中发生了什么变化
9-3. 找出Web API中发生了什么变化 问题 想通过基于REST的Web API服务对数据库进行插入,删除和修改对象图,而不必为每个实体类编写单独的更新方法. 此外, 用EF6的Code Fri ...
- Entity Framework 6 Recipes 2nd Edition(9-4)译->Web API 的客户端实现修改跟踪
9-4. Web API 的客户端实现修改跟踪 问题 我们想通过客户端更新实体类,调用基于REST的Web API 服务实现把一个对象图的插入.删除和修改等数据库操作.此外, 我们想通过EF6的Cod ...
- Entity Framework 6 Recipes 2nd Edition(13-4)译 -> 有效地创建一个搜索查询
问题 你想用LINQ写一个搜索查询,能被转换成更有效率的SQL.另外,你想用EF的CodeFirst方式实现. 解决方案 假设你有如下Figure 13-6所示的模型 Figure 13-6. A s ...
- Entity Framework 6 Recipes 2nd Edition(13-2)译 -> 用实体键获取一个单独的实体
问题 不管你用DBFirst,ModelFirst或是CodeFirst的方式,你想用实体键获取一个单独的实体.在本例中,我们用CodeFirst的方式. 解决方案 假设你有一个模型表示一个Paint ...
- Entity Framework 6 Recipes 2nd Edition(13-3)译 -> 为一个只读的访问获取实体
问题 你想有效地获取只是用来显示不会更新的操作的实体.另外,你想用CodeFirst的方式来实现 解决方案 一个非常常见行为,尤其是网站,就是只是让用户浏览数据.大多数情况下,用户不会更新数据.在这种 ...
- Entity Framework 6 Recipes 2nd Edition(13-5)译 -> 使POCO的修改追踪更高
问题 你正在使用POCO,你想提高修改跟踪的性能,同时使内存消耗更少.另外,你想通过EF的CodeFirst方式来实现. 解决方案 假设你有一个关于Account(帐户)和相关的Payments(支付 ...
- Entity Framework 6 Recipes 2nd Edition(13-9)译 -> 避免Include
问题 你想不用Include()方法,立即加载一下相关的集合,并想通过EF的CodeFirst方式实现. 解决方案 假设你有一个如Figure 13-14所示的模型: Figure 13-14. A ...
- Entity Framework 6 Recipes 2nd Edition(目录索引)
Chapter01. Getting Started with Entity Framework / 实体框架入门 1-1. A Brief Tour of the Entity Framework ...
随机推荐
- MIP 官方发布 v1稳定版本
近期,MIP官方发布了MIP系列文件的全新v1版本,我们建议大家尽快完成升级. 一. 我是开发者,如何升级版本? 对于MIP页面开发者来说,只需替换线上引用的MIP文件为v1版本,就可以完成升级.所有 ...
- SQL Server2014 SP2新增的数据库克隆功能
SQL Server2014 SP2新增的数据库克隆功能 创建测试库 --创建测试数据库 create database testtest use testtest go --创建表 )) --插入数 ...
- AFNetworking 3.0 源码解读 总结(干货)(上)
养成记笔记的习惯,对于一个软件工程师来说,我觉得很重要.记得在知乎上看到过一个问题,说是人类最大的缺点是什么?我个人觉得记忆算是一个缺点.它就像时间一样,会自己消散. 前言 终于写完了 AFNetwo ...
- Kooboo CMS技术文档之一:Kooboo CMS技术背景
语言平台 依赖注入方案 存储模型 1. 语言平台 Kooboo CMS基于.NET Framework 4.x,.NET Framework 4.x的一些技术特性成为站点开发人员使用Kooboo CM ...
- node中子进程同步输出
管道 通过"child_process"模块fork出来的子进程都是返回一个ChildProcess对象实例,ChildProcess类比较特殊无法手动创建该对象实例,只能使用fo ...
- 【Reading Note】算法读书杂记
1 排序 排序基本信息 稳定性:排序前大的数在排序后,大的数依然保持不变就是稳定排序,反之不稳定 内外排序:根据待排序的记录是否放在内存里面区分的.诸如:插入排序(直接插入&希尔).交换排序( ...
- 声音分贝的概念,dBSPL.dBm,dBu,dBV,dBFS
需要做个音频的PPM表,看着一堆的音频术语真是懵了,苦苦在网上扒了几天的文档,终于有了点收获,下面关于声音的分贝做个总结. 分贝 Decibel 分贝(dB)是一个对数单位(logarithmic u ...
- C# 实时折线图,波形图
此Demo是采用VS自带的Chart图表控件,制作实时动态显示的折线图,和波形图. 涉及到知识如下: Chart 控件,功能强大,可以绘制柱状图,折线图,波形图,饼状图,大大简化了对图的开发与定制. ...
- JavaScript学习笔记(三)——this、原型、javascript面向对象
一.this 在JavaScript中this表示:谁调用它,this就是谁. JavaScript是由对象组成的,一切皆为对象,万物皆为对象.this是一个动态的对象,根据调用的对象不同而发生变化, ...
- iOS 小知识点(持续更新)
1.如何通过代码设置Button title的字体大小 设置Button.titleLabel.font = [UIFont systemFontOfSize:<#(CGFloat)#> ...