1

Ich suche, um unter SQL-Anweisung von LINQ zu erreichen. Ich bin mir nicht sicher ob es möglich ist? Kann mir dazu jemand Rat geben?Wie kann ich erreichen, SQL Pivot-Anweisung von LINQ

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] 

Ergebnis der obigen Abfrage wie unten

 
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 

Hinweis sein, dass oben Datum für Woche gruppiert hat. Ie. 09/04, 09/11, 09/18 usw. Ich habe viel recherchiert, aber ich fand nur nach Woche Nummer zu gruppieren.

Dies ist so weit wie ich mit LINQ kommen könnte, die mir die folgende Ergebnismenge zurückgeben wird.

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"; } 
     } 

Ergebnis Datensatz der obver LINQ ist

 
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 

Hoffnung das erklärt, was ich versuche zu erreichen. Kann mir bitte jemand dabei helfen?

+1

gibt es keine native Pivot in Linq, aber Sie können Ihre eigene Gruppe gründen https://code.msdn.microsoft.com/windowsdesktop/CSEFPivotOperation-cbdd79db –

+2

Dies ist einer dieser wiederkehrenden Fragen, die nie eine zufriedenstellende bekommen antworte, weil es keine gibt. –

+0

OK ich verstehe. Weiß jemand, wie man nach dem oben angegebenen Wochenergebnis gruppiert? Verwenden von LINQ. –

Antwort

0

Gut als eine Umgehung habe ich die Methode "FromSQL" des Entity Framework Core verwendet, um meine gespeicherte Prozedur auszuführen, die sich um alle GROUP BY kümmert.

0

können Sie dies verwenden.

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();