Lỗi khi dùng thủ tục bằng linq trong asp.net

Dear các anh chị,

Em mới học viết chưa rành, nên viết hơi lộn xộn anh chị giúp đỡ ạ.
Em có 1 thủ tục chạy trên sql server thì chạy ok.
Nhưng khi sử dụng Linq để dùng thì báo lỗi không chạy được.
Thủ tục khác thì em chạy được. Không hiểu sao con này lỗi.
Em tìm hiểu nhưng chưa sửa được.
Mong anh chị giúp đỡ.
Em cảm ơn!

ALTER Proc [dbo].[testReportEnd]
(
@para int,
@year int
)
AS
BEGIN

DECLARE @ThangXin nvarchar(20) = CONCAT(@year,'-',@para,'-01');
--Declare @ThangXin DateTime = (CONVERT(DATETIME,@ThangXin0));
Declare @thangHienTai DateTime =DATEADD(MONTH, -0, @ThangXin);
Declare @thang1 DateTime =DATEADD(MONTH, -1, @ThangXin);
Declare @thang2 DateTime =DATEADD(MONTH, -2, @ThangXin);
Declare @thang3 DateTime =DATEADD(MONTH, -3, @ThangXin);

Declare @thang1ConDau VARCHAR(25) = CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(@thang1)-1),@thang1),101);
Declare @thang1ConCuoi VARCHAR(25) = CONCAT(CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(DATEADD(mm,1,@thang1))),DATEADD(mm,1,@thang1)),101),' ','23:59:59.999');

Declare @thang2ConDau VARCHAR(25) = CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(@thang2)-1),@thang2),101);
Declare @thang2ConCuoi VARCHAR(25) = CONCAT(CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(DATEADD(mm,1,@thang2))),DATEADD(mm,1,@thang2)),101),' ','23:59:59.999');

Declare @thang3ConDau VARCHAR(25) = CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(@thang3)-1),@thang3),101);
Declare @thang3ConCuoi VARCHAR(25) = CONCAT(CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(DATEADD(mm,1,@thang3))),DATEADD(mm,1,@thang3)),101),' ','23:59:59.999');

SELECT  cave1.Quantity_M1, cave2.Quantity_M2, cave3.Quantity_M3 , v.*,
(select ((coalesce(cave1.Quantity_M1,0) + coalesce(cave2.Quantity_M2,0) + coalesce(cave3.Quantity_M3,0))/3) as tb ) as Average

FROM tblMasterListStationery v 
LEFT JOIN (SELECT ItemMasterNo,SUM(Quantity) as Quantity_M1 FROM tblOutput WHERE OutputDate between @thang3ConDau and @thang3ConCuoi  group by ItemMasterNo) AS cave1  
ON v.ItemMasterNo=cave1.ItemMasterNo
LEFT JOIN (SELECT ItemMasterNo,SUM(Quantity) as Quantity_M2 FROM tblOutput WHERE OutputDate between @thang2ConDau and @thang2ConCuoi  group by ItemMasterNo) as  cave2
ON v.ItemMasterNo=cave2.ItemMasterNo 
LEFT JOIN (SELECT ItemMasterNo, SUM(quantity) as Quantity_M3 FROM tblOutput WHERE OutputDate between @thang1ConDau and @thang1ConCuoi GROUP BY ItemMasterNo) as  cave3
ON v.ItemMasterNo=cave3.ItemMasterNo
where v.ItemMasterNo = cave1.ItemMasterNo or v.ItemMasterNo = cave2.ItemMasterNo or v.ItemMasterNo = cave3.ItemMasterNo

END

Lỗi trên là hạn chế của LINQ-to-SQL DBML Designer khi gặp các Stored Procedure với các query phức hợp với nhiều lệnh SELECT như trong trường hợp của bạn. Bạn có thể giải quyết như sau:

  1. Định nghĩa một stored procedure mới với các tham số giống như stored procedure này (ví dụ như là testReportEndCallee) và chuyển toàn bộ query hiện tại trong stored procedure testReportEnd sang testReportEndCallee.
  2. Đổi cấu trúc của stored procedure testReportEnd thành như sau:
ALTER Proc [dbo].[testReportEnd]
(
@para int,
@year int
)
AS
BEGIN
/* 1. Định nghĩa table varible chứa kết quả trả về */
     DECLARE @ViewResultSet TABLE
    (
        column1 ...,
        column2 ...,
        column3 ...
       ...
    )

   /* 2. Gọi stored procedure testReportEndCallee và insert kết quả trả về từ stored procedure này vào table variable */
    INSERT INTO @ViewResultSet
        EXEC testReportEndCallee @para, @year

  /* 3. Trả về kết quả từ table variable */
  SELECT column1, column2, column3, ... FROM @ViewResultSet

END

Tham khảo:


5 Likes

Đầy đủ quá ạ. Em cảm ơn anh nhiều. Em làm thành công rồi ạ!!

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?