使用EntityFramework調用存儲過程並獲取存儲過程返回的結果集

【實習】剛入職,公司要求完成兩個任務,任務要求使用存儲過程和事務,其中一個問題要獲取存儲過程的查詢結果集。通過多方查找和本身的實踐,終於找到了方法。這裏記錄一下。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

成功事務

相關文章
相關標籤/搜索