分组依据为的Linq到Sql查询
本文关键字:Linq Sql 查询 | 更新日期: 2023-09-27 18:21:12
数据库中有一个表:
[id] [int] IDENTITY(1,1) NOT NULL,
[name] [varchar](150) NOT NULL,
[date_of_birth] [date] NOT NULL,
我需要为GridView获取一个包含2列的数据源。
----------------
| age || count |
----------------
| 20 || 3 |
| 21 || 4 |
| 25 || 5 |
----------------
是否可以用一个查询来完成?
我尝试过的:
var dates = (from u in db.Users
group u by u.date_of_birth into g
select new { age = calculateAge(g.Key) }).ToList();
var dates1 = from d in dates
group d by d.age into g
select new { age = g.Key, count = g.Count() };
GridView1.DataSource = dates1;
GridView1.DataBind();
这是有效的,但我认为有一种方法可以让它更简单。还是不?
p.S.calculateAge具有以下签名
private int calculateAge(DateTime date_of_birth)
- 首先,您在第一个查询中有一个逻辑缺陷。您使用的是按日期分组,而不是按年龄分组,所以在同一年但在不同日期出生的人将被分组到不同的集合中。此"group-by"已被第二个查询"group-by-"子句取代
- 需要注意的第二件事是,您的第二个查询将使用第一个查询的实际结果(请参阅ToList()调用),因此它将在.NET上运行,而不是在SQL端
以下是我的愿景,供您查询(统计相同年龄的人数):
var dates = from u in db.Users
select new { age = calculateAge(g.Key) } into ages
group ages by ages.age into g
select new { age = g.Key, count = g.Count() };
甚至没有匿名类型声明:
var dates = from u in db.Users
select calculateAge(g.Key) into ages
group ages by ages into g
select new { age = g.Key, count = g.Count() };