Entity Framework 6 Recipes 2nd Edition(10-3)译 - 返回结果是一个标量值
10-3. 返回結(jié)果是一個標(biāo)量值
問題
想取得存儲過程返回的一個標(biāo)量值.
解決方案
假設(shè)我們有如Figure 10-2所示的ATM機(jī)和ATM機(jī)取款記錄的模型
?
Figure 10-2. 一個ATM機(jī)和ATM機(jī)取款記錄的模型
我們想要用一個存儲過程在指定機(jī)器和日期內(nèi)返回所有的取款總額
Listing 10-9 是這個存儲過程的代碼
Listing 10-9. GetWithdrawals存儲過程,獲取在指定機(jī)器和日期內(nèi)所有的取款總額
create procedure [Chapter10].[GetWithdrawals]
(@ATMId int, @WithdrawalDate date)
as
begin
select SUM(amount) TotalWithdrawals
from Chapter10.ATMWithdrawal
where ATMId = @ATMId and [date] = @WithdrawalDate
end
接下來就是調(diào)用這個存儲過程的方法:
1. 右擊模型的設(shè)計視圖,選擇“從數(shù)據(jù)庫更新模型”.在對話框中“存儲過程和函數(shù)”下勾選Chapter10/
GetWithdrawals.點擊“完成”.
2.( 譯注:我的環(huán)境是win10+vs2013+ef6.1.3,是不需要這步的,第1步已經(jīng)把這步也完成了)右擊模型的設(shè)計視圖, 選擇“新增“ ? 函數(shù)導(dǎo)入. 從“存儲過程/函數(shù)名稱”下拉框中選擇GetWithdrawals. 在“函數(shù)導(dǎo)入名稱“文本框中輸入:GetWithdrawals. 這個就是在模型中的方法名稱.在“返回以下內(nèi)容的集合“里勾選“標(biāo)量”,在下拉框里選擇Decimal.單擊“確定”.
3.接下來用 Listing 10-10所示代碼使用這個GetWithdrawals 存儲過程
Listing 10-10. 用模型GetWithdrawals()方法查詢存儲過程 GetWithdrawals
??? static void Main(string[] args)
??????? {
??????????? DateTime today = DateTime.Parse("5/7/2013");
??????????? DateTime yesterday = DateTime.Parse("5/6/2013");
??????????? using (var context=new EFRecipesEntities())
??????????? {
??????????????? context.Database.ExecuteSqlCommand("delete from chapter10.ATMWithdrawal");
??????????????? context.Database.ExecuteSqlCommand("delete from chapter10.ATMMachine");
??????????????? var atm = new ATMMachine { ATMId = 17, Location = "12th and Main" };
??????????????? atm.ATMWithdrawals.Add(new ATMWithdrawal{Amount= 20.00m,Date=today});
??????????????? atm.ATMWithdrawals.Add(new ATMWithdrawal { Amount = 100.00M, Date = today });
??????????????? atm.ATMWithdrawals.Add(new ATMWithdrawal { Amount = 75.00M, Date = yesterday });
??????????????? atm.ATMWithdrawals.Add(new ATMWithdrawal { Amount = 50.00M, Date = today });
??????????????? context.ATMMachines.Add(atm);
??????????????? context.SaveChanges();
??????????? }
??????????? using (var context=new EFRecipesEntities())
??????????? {
??????????????? var forToday = context.GetWithdrawals(17, today).FirstOrDefault();
??????????????? var forYesterday = context.GetWithdrawals(17, yesterday).FirstOrDefault();
??????????????? var atm = context.ATMMachines.Where(o => o.ATMId == 17).FirstOrDefault();
??????????????? Console.WriteLine("ATMWithdrawals for ATM at {0} at {1}",atm.ATMId,atm.Location);
?????????? ?????Console.WriteLine("\t{0} Total Withdrawn={1}",yesterday.ToShortDateString(),forYesterday.Value.ToString("C"));
??????????????? Console.WriteLine("\t{0} Total Withdrawn={1}",today.ToShortDateString(),forToday.Value.ToString("C"));
??????????? }
?????? ?????Console.WriteLine("\npress any key to exit...");
??????????? Console.Read();
??????? }
輸出結(jié)果如下面的 Listing 10-10:
==============================================================
ATM Withdrawals for ATM at 17 at 12th and Main
5/6/2013 Total Withdrawn = $75.00
5/7/2013 Total Withdrawn = $170.00
==============================================================
它是如何工作的?
注意:EF會把從存儲過程取回的標(biāo)量值認(rèn)為是一個集合.在我們的例子里,我們的存儲過程返回一個單一的decimal值,我們用FirstOrDefault()方法把它從集合中提取出來
附:創(chuàng)建示例用到的數(shù)據(jù)庫的腳本文件
總結(jié)
以上是生活随笔為你收集整理的Entity Framework 6 Recipes 2nd Edition(10-3)译 - 返回结果是一个标量值的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows遗产之RPC/DCOM:还
- 下一篇: 如何进行ElasticSearch大数据