LINQ to SQL:Group,Count,Sum。我很困惑

时间:2015-11-06 15:36:56

标签: c# sql sql-server linq

早上好,      我整个上午都被困在这上面,觉得我已经撞到了墙上。我喜欢此时可以给出的任何建议。  我的表基本如下:

PatientName|LivingSpace
-----------|-----------
Patient 1  | Unit 1
Patient 2  | Unit 1
Patient 3  | Unit 2
Patient 4  | Unit 2
Patient 5  | Unit 3
Patient 6  | Unit 3
Patient 7  | Unit 3
Patient 8  | Unit 3

我需要一个LINQ to SQL查询来说明这一点:

   Unit|Count
   ----|-----
Unit 1 |  2
Unit 2 |  2
Unit 3 |  4
TOTAL  |  8

我的SQL查询工作正常,我只是遇到将其转换为LINQ的问题:

SELECT LivingSpace, COUNT(LivingSpace) AS LivingSpace
FROM PatientTable
WHERE Status = 'Active'
GROUP BY LivingSpace
    UNION ALL
    SELECT 'SUM' LivingSpace, COUNT(LivingSpace)
    FROM PatientTable

5 个答案:

答案 0 :(得分:3)

var counts = from x in ctx.PatientTable
      group x by x.LivingSpace into y
      select new { Key = y.Key Count = y.Count() };

var total  = new { Key = "Total" , Count = ctx.PatientTable.Count() };

var full = counts.ToList();

full.Add(total);

答案 1 :(得分:0)

如果您想在一个查询中完成所有操作,则以下内容应该有效(当然,调整您的属性的实际名称)。

context.PatientTable.GroupBy(a => a.LivingSpace.Name, a => 1)
    .Select(a => new 
        {
            a.Key, 
            Total = a.Sum(q => q) 
        })
    .Union(PatientTable.Select(a => new 
        { 
            Key = "Total", 
            Total = PatientTable.Count() 
        }))

答案 2 :(得分:0)

$scope.theChart.colours = getcolors(); //doesn't work

function getcolors(array){
var colors = [];
  for (var i = 0; i < 7; i++) {
    colors[i] = getRandomColor();
  }
  return colors;
}

  function getRandomColor() {
    var letters = '0123456789ABCDEF'.split('');
    var color = '#';
    for (var i = 0; i < 6; i++ ) {
        color += letters[Math.floor(Math.random() * 16)];
    }
    return color;
}

答案 3 :(得分:0)

这样的事情应该可以运行并运行一个查询。

var results = db.PatientTable
    .GroupBy(p => p.LivingSpace)
    .Select(grp => new 
        { 
            Unit = grp.Key, 
            Count = grp.Count() 
        })         
    .Union(db.PatientTable
        .GroupBy(p => 1)
        .Select(grp => new 
            { 
                Unit = "Total", 
                Count = grp.Count() 
            }));

答案 4 :(得分:0)

我看到你得到了答案,但出于学习目的,这里是并排转换。

您的SQL(添加了一些别名以便更好地进行比较)

SELECT P.LivingSpace, COUNT(P.*) AS Count
FROM PatientTable AS P
WHERE P.Status = 'Active'
GROUP BY P.LivingSpace

UNION ALL

SELECT 'SUM' AS LivingSpace, COUNT(P.*) AS Count
FROM PatientTable AS P

LINQ中的相同单个查询

var query =
(
from p in db.PatientTable
where p.Status = "Active"
group p by p.LivingSpace into g
select new { LivingSpace = g.Key, Count = g.Count() }
)
.Concat
(
from p in db.PatientTable
group p by "SUM" into g
select new { LivingSpace = g.Key, Count = g.Count() }
);