2010-12-30 7 views
0

Скажем, у меня есть база данных с 5 000 сообщений в блоге за последние 2 года, я пытаюсь создать «ежемесячные» архивы, чтобы я мог отображать данные гораздо логичнее.Ежемесячные архивы

По какой-то причине мне никогда не приходилось работать с такой датой, и мне не хватает знаний.

Я использую Linq/C#; может ли кто-нибудь указать мне в правильном направлении, чтобы узнать, как это сделать?

Приветствия

Matt

ответ

0

Ну, это не сильно отличается от фильтрации на основе целого свойства:

DateTime beginDate, endDate; 
// set beginDate and endDate as appropriate, based on the month you are displaying 
// beginDate = new DateTime(2011, 1, 1); 
// endDate = beginDate.AddMonths(1); 
var query = from post in db.Entries 
      where post.Date >= beginDate && post.Date < endDate 
      orderby post.Date descending 
      select post; 
0

Это действительно зависит от ваших требований и как UI потоков. В большинстве случаев вы можете предоставить ряд дат и запрос для сообщений в этом диапазоне.

Форматирование полученных сообщений полностью зависит от вас, с какими инструментами вы должны работать, и что вам нужно для этого. Тем не менее, вы можете использовать GroupBy для группировки сообщений в определенную дату, а затем перебирать каждую группу для вывода отдельных ссылок. Мой пример ниже показывает вам это в консольном приложении. Вы должны иметь возможность экстраполировать, как применять его к вашим потребностям.

var postsByMonth = (from post in context.Posts 
          where post.Date >= start && post.Date < end 
          orderby post.Date descending 
          select post).GroupBy(post => new DateTime(post.Date.Year, post.Date.Month, 1)); 

      foreach (IGrouping<DateTime, Post> posts in postsByMonth) 
      { 
       Console.WriteLine("{0:MMM} {0:yyyy}", posts.Key); 
       Console.WriteLine("======================"); 
       Console.WriteLine(); 

       foreach (Post post in posts) 
       { 
        Console.WriteLine("Post from {0}", post.Date); 
       } 

       Console.WriteLine(); 
      }