分组依据为的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)

分组依据为的Linq到Sql查询

  • 首先,您在第一个查询中有一个逻辑缺陷。您使用的是按日期分组,而不是按年龄分组,所以在同一年但在不同日期出生的人将被分组到不同的集合中。此"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() };