2011-06-30 40 views
0

如何使用LINQ或HQL執行以下SQL查詢?如何區分具有城堡活動記錄的選擇和組合?

SELECT `year`, `month`, COUNT(code_id) 
    FROM (SELECT DISTINCT request_codes_id AS code_id, 
    YEAR(requested) AS `year`, MONTH(requested) AS `month` FROM requests) r 
    GROUP BY `year`, `month` 
    ORDER BY `year`, `month`; 

我試過如下:

var items = from r in TestaccountRequest.Queryable 
      group r by r.RequestCodeId into g 
      select g.First(); 
var grouped = from r in items 
       group r by r.Requested.ToString("yyyyMM") into y 
       select new { Year = y.First().Requested.Year, Month = y.First().Requested.Month, Count = y.Count() }; 

它扔了System.String ToString(System.String) NotSupportedException

UPDATE:

第一LINQ查詢的g.First()似乎會導致問題,因爲如果我只運行的第一個我得到一個Code supposed to be unreachable -Exception,但如果我刪除.First()它「作品「,但沒有回報我所需要的。

回答

0

我還挺解決它使用下列內容:

var items = from r in TestaccountRequest.Queryable 
      group r by r.RequestCodeId into g 
      select g.ElementAt(0); 
var grouped = from r in items.ToList() 
       group r by new { Year = r.Requested.Year, 
           Month = r.Requested.Month } into g 
       select new { g.Key.Year, g.Key.Month, Count = g.Count() }; 

但我客串那不是因爲所有的目標都從DB獲得獲取最佳的解決方案,但至少現在正在開展工作,但如果可能的話,請提供更好的解決方案。

編輯:
我現在解決了它使用HQL:

HqlBasedQuery query = new HqlBasedQuery(typeof(ActivationCodeTestaccountRequestRecord), 
      "SELECT DISTINCT r.ActivationCodeId, YEAR(r.Requested), MONTH(r.Requested) " + 
      "FROM ActivationCodeTestaccountRequestRecord r"); 
var items = from object[] row in (ArrayList)ActiveRecordMediator.ExecuteQuery(query) 
      group row by new { Year = row[1], Month =row[2] } into g2 
      select new { Year = g2.Key.Year, Month = g2.Key.Month, Count = g2.Count() }; 
1

集團由一個匿名類型來代替:

var grouped = from r in items 
       group r by new { Year = r.Requested.Year, 
           Month = r.Requested.Month } into g 
       select new { g.Key.Year, g.Key.Month, Count = g.Count() }; 
+0

這引起了我一個'指定的方法不supported.'的異常... – ChrFin

+0

@chrfin:它是否說* *哪方法? –

+0

不是真的;堆棧跟蹤中的最後一行是'NHibernate.Hql.Ast.ANTLR.PolymorphicQuerySourceDetector.GetClassName(IASTNode querySource)',但請參閱我的問題更新。 – ChrFin