LINQ to SQL: Выберите количество строк для каждой даты в указанном диапазоне? - PullRequest
2 голосов
/ 24 октября 2011

У меня есть таблица Account со столбцом с именем CreatedOn (nullable datetime).

Я пишу метод, который принимает два параметра от и до (объекты DateTime), и я хочу выбрать все даты междуот и до вместе с количеством строк в T, которые были созданы в каждую из этих дат.

Как я могу сделать это элегантным и эффективным способом в LINQ?

Я пытался сделать это таким образом, но, похоже, запрашивает базу данных один раз для каждой даты в списке дат:

static void Test(DataClasses1DataContext context, DateTime from, DateTime to)
{
    List<DateTime> dates = new List<DateTime>();
    while (from <= to)
    {
        dates.Add(from.Date);
        from = from.AddDays(1);
    }

    var result = dates.Select(d => new { Date = d, Count = context.Accounts.Count(a => a.CreatedOn.HasValue && a.CreatedOn.Value.Date == d) });
    foreach (var row in result)
            Console.WriteLine(row.Date + "   " + row.Count);
}

1 Ответ

3 голосов
/ 24 октября 2011

Обновлено в ответ на комментарий

Я бы не сказал, что это элегантно, но он запрашивает базу данных только один раз.

static void Test(DataClasses1DataContext context, DateTime fromDate, DateTime toDate)
{
    var result = context.Accounts
                .Where(p => p.CreatedOn >= fromDate && p.CreatedOn <= toDate)
                .GroupBy(x => x.CreatedOn.Date)
                .Select(x => new {
                   dt = x.Key,
                   count = x.Count()});
}

List<DateTime> dates = new List<DateTime>();
while (fromDate <= toDate)
{
    dates.Add(fromDate.Date);
    fromDate = fromDate.AddDays(1);
}    

var allDates = dates.Select(x => new {
                    dt = x,
                    count = 0});

// Merge both lists and then filter to include highest count
var result = rows.Concat(allDates)
                 .GroupBy(x => x.dt)
                 .Select(x => new {
                    dt = x.Key,
                    count = x.OrderByDescending(c => c.count)
                             .FirstOrDefault().count});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...