【发布时间】:2017-10-06 20:22:30
【问题描述】:
我希望通过 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]
以上查询的结果如下
日期 低 中 高 2017 年 9 月 4 日 370 174 175 2017 年 9 月 11 日 764 352 389 2017 年 9 月 18 日 759 384 360 2017 年 9 月 25 日 765 385 404 2017 年 10 月 2 日 115 48 56请注意,以上日期已按周分组。 IE。 09/04 , 09/11, 09/18 等。我做了很多研究,但我发现只能按周数分组。
这是我所能想到的 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"; }
}
obver LINQ的结果数据集是
日期文本值 09/04/2017 低 65 09/04/2017 地中海 80 09/04/2017 高 40 09/05/2017 低 30 10/05/2017 地中海 50 2017 年 10 月 5 日 高 44希望这能解释我想要实现的目标。请问有人可以帮我吗?
【问题讨论】:
-
linq中没有原生pivot,但是你可以创建自己的code.msdn.microsoft.com/windowsdesktop/…
-
这是那些反复出现的问题之一,因为没有得到满意的答案。
-
好的,我明白了。有人知道如何按上述结果集按周分组吗?使用 LINQ。
标签: sql sql-server entity-framework linq entity-framework-core