【實習】剛入職,公司要求完成兩個任務,任務要求使用存儲過程和事務,其中一個問題要獲取存儲過程的查詢結果集。通過多方查找和本身的實踐,終於找到了方法。這裏記錄一下。html
看到的這篇文章中給出的例子是查詢單個表的全部數據,可是個人要求是多表查詢並獲取其中的幾個字段。並且我是使用POCO(POCO是指Plain Old Class Object,也就是最基本的CLRClass),仍是和示例有諸多不一樣。這裏我結合文章中的示例和本身的嘗試,解決了這個問題數據庫
首先創建存儲過程 能夠看到 這裏我只須要sn.jewelry_type ,tr.[History Sign2] ,SUM(his.[Actual_Selling_Price]) AS Summary這三個字段單元測試
CREATE PROCEDURE dbo.SP_Branch_Month_Sells @branchCode INT, @transactionDate DATE AS SELECT sn.jewelry_type AS JewelryType, tr.[History Sign2] AS HistorySign2, SUM(his.[Actual_Selling_Price]) AS Summary FROM dbo.History his INNER JOIN dbo.[stock nature] sn ON his.[Stock Type] = sn.stock_type AND his.[Stock Group] = sn.stock_group INNER JOIN dbo.[History Tran Code] tr ON his.[Tran Code] = tr.[History Tran Code] WHERE his.[Branch Code From] = @branchCode AND sn.[jewelry_type] IN ( 1, 2, 3 ) AND tr.[History Sign2] IN ( 2, 7, 8, -2, -7, -8 ) AND DateDiff(mm,his.[Transaction Date],@transactionDate)=0 GROUP BY sn.jewelry_type, tr.[History Sign2] GO
而後根據這三個字段創建對應的實體類和配置類,雖然在數據庫中並無對應的表,這裏的實體類只是做爲存儲過程的結果集的對應實體測試
public class SellEntity { public Int16 JewelryType { get; set; } public Int16 HistorySign2 { get; set; } public decimal Summary { get; set; } } public class SellConfig:EntityTypeConfiguration<SellEntity> { public SellConfig() { //EF 須要每一個表都有一個鍵,這裏的JewelryType並無實際鍵的意義,只是爲知足EF的要求 HasKey(u => u.JewelryType); Property(u => u.JewelryType).HasColumnName("JewelryType"); Property(u => u.HistorySign2).HasColumnName("HistorySign2"); } }
而後就可使用EF調用存儲過程來獲取結果集並和實體類對應起來,注意這裏我使用了DTO,spa
public class SellDTO { public int JewelryType { get; set; } public int HistorySign2 { get; set; } public decimal Summary { get; set; } } public SellDTO[] GetSells(int branchCode, DateTime monthDate) { using(TrainContext ctx = new TrainContext()) { var paramters = new SqlParameter[] { new SqlParameter("branchCode",SqlDbType.Int) { Value=branchCode}, new SqlParameter("transactionDate", SqlDbType.Date) { Value =monthDate.ToShortDateString() } };
//EO轉換成DTO return ctx.Sells.SqlQuery("EXEC dbo.SP_Branch_Month_Sells @branchCode,@transactionDate)", paramters) .ToList().Select(u=>new SellDTO() { JewelryType = u.JewelryType, HistorySign2 = u.HistorySign2, Summary = u.Summary }).ToArray(); } }
這裏是DAL層的代碼,BLL層只是對參數作轉發3d
public class SellBLL { public SellDTO[] GetSellByMonthAndBranchCode(int branchCode, DateTime monthDate) { var sellDAL = new SellDAL(); return sellDAL.GetSells(branchCode, monthDate); } }
下面進行單元測試:code
[TestClass] public class SellTests { [TestMethod] public void GetSellByMonthAndBranchCodeTest() { SellBLL sellBLL = new SellBLL(); var sells = sellBLL.GetSellByMonthAndBranchCode(3158, DateTime.Today.AddDays(-26)); } }
測試結果htm
拿到結果集 和直接在數據庫查詢的結果一致。blog
成功事務