如何将这个动态的sql脚本转换成LinqToSql?

时间:2010-09-09 03:28:05

标签: sql linq-to-sql

如何将此动态sql脚本转换为LinqToSql?

-- Create sample table

Create Table TEST
(DATES Varchar(6),
 EMPNO Varchar(5),
 STYPE Varchar(1),
 AMOUNT Int)

-- Insert sample data

Insert TEST Select '200605',  '02436',     'A',        5
Union All Select '200605',  '02436',     'B',        3
Union All Select '200605',  '02436',     'C',        3 
Union All Select '200605',  '02436',     'D',        2
Union All Select '200605',  '02436',     'E',        9
Union All Select '200605',  '02436',     'F',        7
Union All Select '200605',  '02436',     'G',        6
Union All Select '200605',  '02438',     'A',        7
Union All Select '200605',  '02438',     'B',        8
Union All Select '200605',  '02438',     'C',        0 
Union All Select '200605',  '02438',     'D',        3
Union All Select '200605',  '02438',     'E',        4
Union All Select '200605',  '02438',     'F',        5
Union All Select '200605',  '02438',     'G',        1
GO



-- the sql script which I want to convert into LinqToSql

Declare @S Varchar(1000)
Set @S=''

Select @S=@S+',SUM(Case STYPE When '''+STYPE+''' Then AMOUNT Else 0 End) As '+STYPE 
From (Select Distinct STYPE From TEST) A Order By STYPE

Set @S='Select DATES,EMPNO'+@S+' From TEST Group By DATES,EMPNO Order By DATES,EMPNO'
EXEC(@S)
GO

1 个答案:

答案 0 :(得分:0)

您不需要动态SQL来计算这些总和。此查询计算您需要的每个数字。

SELECT Dates, EmpNo, SType, SUM(Amount)
FROM Temp
GROUP BY Dates, EmpNo, SType
ORDER BY Dates, EmpNo, SType

并且很容易翻译成LinqToSql。

var query = 
  from rec in db.Temps
  group rec by new {rec.Dates, rec.EmpNo, rec.SType} into g
  order by g.Key.Dates, g.Key.EmpNo, g.Key.SType
  select new
  {
    Dates = g.Key.Dates,
    EmpNo = g.Key.EmpNo,
    SType = g.Key.SType,
    TheSum = g.Sum()
  };

一旦你在记忆中获得了这些金额,那么你可以做任何你喜欢的结果。