【发布时间】:2010-09-05 23:27:17
【问题描述】:
我有一张桌子
ID|VALUE
VALUE 是一个整数字段,可能取值在 0 到 4 之间。如何查询每个值的计数?
理想情况下,结果应该是一个包含 6 个元素的数组,一个用于计算每个值的计数,最后一个是总行数。
【问题讨论】:
标签: c# sql linq linq-to-sql
我有一张桌子
ID|VALUE
VALUE 是一个整数字段,可能取值在 0 到 4 之间。如何查询每个值的计数?
理想情况下,结果应该是一个包含 6 个元素的数组,一个用于计算每个值的计数,最后一个是总行数。
【问题讨论】:
标签: c# sql linq linq-to-sql
这个简单的程序就是这样做的:
class Record
{
public int Id { get; set; }
public int Value { get; set; }
}
class Program
{
static void Main(string[] args)
{
List<Record> records = new List<Record>()
{
new Record() { Id = 1, Value = 0},
new Record() { Id = 2, Value = 1 },
new Record() { Id = 3, Value = 2 },
new Record() { Id = 4, Value = 3 },
new Record() { Id = 5, Value = 4 },
new Record() { Id = 6, Value = 2 },
new Record() { Id = 7, Value = 3 },
new Record() { Id = 8, Value = 1 },
new Record() { Id = 9, Value = 0 },
new Record() { Id = 10, Value = 4 }
};
var query = from r in records
group r by r.Value into g
select new {Count = g.Count(), Value = g.Key};
foreach (var v in query)
{
Console.WriteLine("Value = {0}, Count = {1}", v.Value, v.Count);
}
}
}
输出:
Value = 0, Count = 2
Value = 1, Count = 2
Value = 2, Count = 2
Value = 3, Count = 2
Value = 4, Count = 2
稍作修改的版本返回一个仅包含值计数的数组:
int[] valuesCounted = (from r in records
group r by r.Value
into g
select g.Count()).ToArray();
最后添加行数:
valuesCounted = valuesCounted.Concat(new[] { records.Count()}).ToArray();
【讨论】:
以下是获取VALUE 的每个值的行数的方法,按顺序排列:
var counts =
from row in db.Table
group row by row.VALUE into rowsByValue
orderby rowsByValue.Key
select rowsByValue.Count();
要获得表中的总行数,您可以将所有计数相加。但是,您不希望原始序列被迭代两次;这将导致查询被执行两次。相反,您应该先制作一个中间列表:
var countsList = counts.ToList();
var countsWithTotal = countsList.Concat(new[] { countsList.Sum() });
【讨论】: