Как четко выделить и сгруппировать с активными записями замка? - PullRequest
0 голосов
/ 30 июня 2011

Как я могу выполнить следующий SQL-запрос с использованием LINQ или HQL?

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:

Кажется, что g.First() в первом LINQ-Query вызывает проблему, потому что, если я только запускаю первый, я получаю Code supposed to be unreachable -Exception, но если я удаляю .First(), он "работает", но не возвращает то, что мне нужно.

Ответы [ 2 ]

1 голос
/ 30 июня 2011

Вместо этого группируйте по анонимному типу:

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 голосов
/ 30 июня 2011

Я вроде решил, используя следующее:

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() };

но я догадываюсь, что это не лучшее решение, поскольку все объекты извлекаются из БД, но, по крайней мере, пока оно работает, но, пожалуйста, предоставьте лучшее решение, если доступно.

EDIT:
Теперь я решил это с помощью 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() };
...