2013-07-06 102 views
0

有一個表在數據庫:LINQ到SQL查詢與GROUP BY

[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) 

回答

1
  • 首先,你必須在第一個查詢邏輯缺陷。您正在使用按日期分組,而不是按年齡分組,因此在同一年但不同日期出生的人將被分組到不同的分組中。這個'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() }; 
+0

它給出了一個例外方法「的Int32 calculateAge(System.DateTime)'不支持對SQL的轉換。 – Novikoff

+0

我對LinqToSql不是很熟悉。但我假設在你的解決方案中,首先在SQL端進行分組,並在.NET端進行選擇。而在我的解決方案中,有一組是按_after_選擇的。 – Aleksei