Я ищу наиболее эффективный способ отсосать серию ежемесячных подсчетов записей в моей базе данных, но с учетом часового пояса, поскольку время фактически сохраняется как UTC. Мне бы хотелось, чтобы мой набор результатов представлял собой серию объектов, включающую месяц, год и число.
У меня есть объекты LINQ to SQL, которые выглядят примерно так:
public class MyRecord {
public int ID { get; set; }
public DateTime TimeStamp { get; set; }
public string Data { get; set; }
}
Я не против использования прямого SQL, но LINQ to SQL, по крайней мере, сделает код намного более чистым. Настройка часового пояса доступна в виде целого числа (например, -5). Опять же, набор результатов, который я ищу, это объекты, содержащие месяц, год и число, все целые числа.
Есть предложения? Я могу придумать несколько способов сделать это прямо, но не с настройкой часового пояса.
РЕДАКТИРОВАТЬ: Ответ ниже заставил меня направиться в правильном направлении. Это то, что я в конечном итоге закончил:
var counts = _context.MyRecord
.Select(r => new {original = r.TimeStamp, adjusted = TimeAdjust.GetAdjustedTime(Config.TimeZoneAdjustment, r.TimeStamp)}).ToArray()
.GroupBy(r => new {r.adjusted.Month, r.adjusted.Year})
.Select(g => new MonthCount { Count = g.Count(), Year = g.Key.Year, Month = g.Key.Month })
.OrderByDescending(g => g.Year).ThenByDescending(g => g.Month);
По сути, я опускаю все даты, что работает нормально, учитывая ограниченную область применения этого приложения. Функция TimeAdjust получает «реальное» скорректированное время с учетом DLS. Вызов ToArray () сделан для того, чтобы избежать ленивого выполнения SQL-кода из-за функции корректировки времени.