2017-10-06 21 views
1

我期待在LINQ下的SQL語句實現。我不確定是否可能?有人能就此提出建議嗎?我如何從LINQ實現SQL透視語句

SELECT * 
FROM (
    SELECT CONVERT(VARCHAR, (DATEADD(WEEK, DATEDIFF(WEEK, 0, S.SampleDrawn), 0)), 101) [Date], [Range] = 
     CASE 
      WHEN ProbBacteremia >= 0 AND ProbBacteremia < 0.50 THEN 'Low' 
      WHEN ProbBacteremia >= 0.50 AND ProbBacteremia < 0.75 THEN 'Med' 
      ELSE 'High' 
     END 
    FROM Result.Calculation C INNER JOIN Data.SampleSet S ON C.SampleSetID = S.ID WHERE S.SampleDrawn >= DATEADD(WEEK,-1,GETDATE())) o 
    PIVOT 
    (
     COUNT(o.[Range]) 
     FOR [Range] IN (
     [Low], [Med], [High]) 
    ) pt 
    ORDER BY [Date] 

上述查詢的結果將是如下

 
Date  Low Med High 
09/04/2017 370 174 175 
09/11/2017 764 352 389 
09/18/2017 759 384 360 
09/25/2017 765 385 404 
10/02/2017 115 48 56 

需要注意的是,上面的日期按星期分組。 IE瀏覽器。 09/04,09/11,09/18等。我做了很多研究,但是我發現只按週數分組。

這是就我能想出的LINQ,它會返回給我下面的結果集。在obver LINQ的

data = (from a in context.Calculations 
          where a.SampleSet.SampleDrawn >= dtStart && (isDeptFilter || a.SampleSet.Department == location) 
          group a by new { Text = RangeProvider(a.ProbBacteremia * 100, riskCats), Date = a.SampleSet.SampleDrawn.Date } into groupedData 
          orderby groupedData.Key.Date ascending 
          select new { Value = groupedData.Count(), Text = groupedData.Key.Text, Date = groupedData.Key.Date.ToShortDateString() }).ToList(); 

public static string RangeProvider(int value) 
     { 
      if (value > 0 && value <= 25) 
      { return "Low"; } 
      if (value > 25 && value <= 75) 
      { return "Medium"; } 
      if (value > 75 && value <= 90) 
      { return "High"; } 
      else 
      { return "Very High"; } 
     } 

結果集是

 
Date  Text Value 
09/04/2017 Low 65 
09/04/2017 Med 80 
09/04/2017 High 40 
09/05/2017 Low 30 
10/05/2017 Med 50 
10/05/2017 High 44 

希望這解釋了什麼是我想要的目的。請有人可以幫助我嗎?

+1

沒有在LINQ本土支點,但你可以創建自己的https://code.msdn.microsoft.com/windowsdesktop/CSEFPivotOperation-cbdd79db –

+2

這是那些反覆出現的問題,從來沒有得到一個滿意的一個回答因爲沒有。 –

+0

好吧,我明白了。有人知道如何按上述結果進行分組嗎?使用LINQ。 –

回答

0

那麼作爲解決方法,我已經使用了實體框架核心的「FromSQL」方法來執行我的存儲過程,它處理所有的GROUP BY。

0

你可以使用這個。

data = (from a in context.Calculations 
      where a.SampleSet.SampleDrawn >= dtStart && (isDeptFilter || a.SampleSet.Department == location) 
      group a by new { Text = RangeProvider(a.ProbBacteremia * 100, riskCats), Date = a.SampleSet.SampleDrawn.Date } into groupedData 
      orderby groupedData.Key.Date ascending 
      select new { 
       Date = groupedData.Key.Date.ToShortDateString() , 
       Low = (groupedData.Key.Text =="Low")?groupedData.Count() : 0, 
       Medium = (groupedData.Key.Text =="Medium")?groupedData.Count() : 0, 
       High = (groupedData.Key.Text =="High")?groupedData.Count() : 0, 
       VeryHigh = (groupedData.Key.Text =="Very High")?groupedData.Count() : 0 
      }).ToList();