2012-06-12 2 views
0

Я написал следующий LINQ-to-SQL, чтобы я мог получить общее количество записей в день.Получение числа записей по дате в запросе LINQ to SQL, даже если результатов нет

Есть несколько модификаций, которые я хотел бы сделать, чтобы они соответствовали моим потребностям. Я делал различные попытки, но не смог понять это правильно.

Я бы хотел указать последние 9 дней, даже если в это время не было никаких «открытий». Я также хотел бы сгруппировать по Дню/Месяцу, а не только Дню, как я делаю ниже.

Пример вывода я хотел бы получить бы:

DateString Opens 
=================== 
9/5   0 
10/5   0 
11/5   3 

и т.д ...

public List<OpensOverTimeViewModel> GetOpensOverTimeViewModel(int eId) 
{ 

    DateTime lastDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day).AddDays(-9); 
    DateTime currentDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day).AddDays(1); 

    var summary = (from p in db.Opens 
        where (p.ElementId == eId) && (p.Timestamp >= lastDate) && (p.Timestamp <= currentDate) 
        let k = new 
        { 
         Day = p.Timestamp.Day 
        } 
        group p by k into t 
        select new OpensOverTimeViewModel 
        { 
         DateString = t.Key.Day, 
         TotalOpens = t.Count(), 
         ElementName = "" 
        }).ToList(); 

    return summary; 
} 

Любая помощь о том, как лучше подойти к решению этого была бы оценена.

+2

Вы можете заменить 'DateTime (DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day)' на 'DateTime.Today'. –

ответ

1

Вы можете создать левое соединение в коде после того, как вы получили результат обратно из базы данных

Помещенный ниже строки непосредственно перед return summary; линии.

var allDates = from idx in Enumerable.Range(0, (currentDate - lastDate).Days) 
       select lastDate.AddDays(idx); 

summary = (
      from allDate in allDates 
      join su in summary on allDate.Day equals su.DateString into x 
      from su in x.DefaultIfEmpty() 
      select new OpensOverTimeViewModel 
      { 
       DateString = allDate.Day, 
       TotalOpens = su == null ? 0 : su.TotalOpens, 
       ElementName = "" 
      }).ToList(); 

Для группы в день/месяц я предлагаю использовать всю дату, заменяя t.Key.Day с t.Key.Date и изменения DateString в DateTime.

+0

Спасибо за отличный ответ. Единственный вопрос, который у меня есть сейчас, - это как указать dd/MM как DateString. Когда я конкатенирую строки, LINQ-to-SQL соответствует. – Nick

+0

Не работает 't.Key.Month +"/"+ t.Key.Day'? –

+0

«Указанный член типа« Дата »не поддерживается в LINQ to Entities. Поддерживаются только инициализаторы, сущности и свойства навигации сущности». – Nick

Смежные вопросы