Как получить только уникальные комбинации месяца и года? - PullRequest
1 голос
/ 11 октября 2011

Использование VBNET, MVC 3 и Entity Framework для написания моего первого mvc-приложения - однопользовательского блогового приложения. Я пытаюсь создать архивную боковую панель, которая будет отображать что-то вроде октября 2011 года, и когда пользователь нажмет кнопку, он увидит все сообщения в октябре. Прямо сейчас все мои попытки показывают либо повторяющиеся даты - если в октябре есть 3 сообщения, то я вижу октябрь 2011 3 раза или я возвращаюсь только один месяц год, комбо скажем октябрь 2011.

Используя groupby с firstordefault, я вернусь только на один месяц назад.

posts = _rdsqlconn.Posts.Where(Function(p) p.PostIsPublished = True).GroupBy(Function(d) d.PostDatePublished).FirstOrDefault

Как мне вернуть уникальные комбинации месяца и года с EF?

<ч />

Дополнительная информация

У меня есть эта функция в моем хранилище. Я хочу собрать пары месяц и год, чтобы у меня была только одна пара, скажем, ocotober, даже если в октябре было 3 поста. В хранилище:

Public Function SelectPostsByDate() As IEnumerable(Of Entities.Post) Implements Interfaces.IPostRepository.SelectPostsByDate  

 Using _rdsqlconn As New RDSQLConn
            Dim posts
            posts = _rdsqlconn.Posts.Where(Function(p) p.PostIsPublished = True).GroupBy(Function(p) New With {p.PostDateCreated.Year, p.PostDateCreated.Month}).Select(Function(g) g.Key)
            'posts = _rdsqlconn.Posts.Where(Function(p) p.PostIsPublished = True).GroupBy(Function(p) New With {p.PostDatePublished.Value.Year, p.PostDatePublished.Value.Month})
            Return posts
        End Using
    End Function

В моем контроллере у меня есть

  Function DateViewPartial() As PartialViewResult
        Return PartialView(_postRepository.SelectPostsByDate)
    End Function

Мой частичный вид:

      @ModelType IEnumerable (of RiderDesignMvcBlog.Core.Entities.Post)
    <hr />
    <ul style="list-style: none; margin-left:-35px;"> 
   @For Each item In Model       
      @<li> @Html.ActionLink(item.PostDatePublished.Value.ToString("Y"), "Archives", "Blog", New With {.year = item.PostDatePublished.Value.Year, .month = item.PostDatePublished.Value.Month}, Nothing)</li>      
     Next
     </ul>

В _Layout.vbhtml я вызываю частичное представление для отображения на боковой панели:

 <h3>Posts by Date</h3>
        @code
            Html.RenderAction("DateViewPartial", "Blog")
        End Code   

Ответы [ 2 ]

0 голосов
/ 11 октября 2011

В VB:

Dim groupedPosts = _rdsqlcon.Posts.
        Where(Function(p) p.PostIsPublished = True).
        GroupBy(Function(p) New With {p.PostDatePublished.Year, p.PostDatePublished.Month }).
        Select(g => g.Key)

Это просто возвращает уникальные годы и месяцы.Если вы хотите включить сообщения для каждого, попробуйте следующее:

Dim groupedPosts = _rdsqlcon.Posts.
            Where(Function(p) p.PostIsPublished = True).
            GroupBy(Function(p) New With {p.PostDatePublished.Year, p.PostDatePublished.Month 

Оттуда вы можете отобразить группы по годам и месяцам и соответствующие сообщения для каждого:

For Each group In groupedPosts
   Console.WriteLine(group.Key.Year & "-" & group.Key.Month)
   For Each post In group
      Console.WriteLine(post.PostDatePublished)
   Next
Next
0 голосов
/ 11 октября 2011

Я бы попробовал это (в C #):

var yearMonths = _rdsqlconn.Posts
    .Where(p => p.PostIsPublished)
    .GroupBy(p => new { p.PostDatePublished.Year, p.PostDatePublished.Month })
    .Select(a => a.Key)
    .ToList();

Это дает вам список анонимных объектов. Каждый объект имеет свойства Year и Month - например, yearMonths[0].Year, yearMonths[0].Month и т. Д. Применяя Select, вы фактически отбрасываете элементы в каждой группе и получаете только список ключей группы. (год и месяц).

Редактировать

Я думаю, для вашей цели лучший способ - это ввести "ViewModel" для частичного представления боковой панели. ViewModel будет описывать группу года и месяца, например:

public class ArchiveMonthViewModel
{
    public int Year { get; set; }
    public int Month { get; set; }
}

Тогда вы не группируете с анонимным типом, а используете этот тип ViewModel:

var archiveViewModels = _rdsqlconn.Posts
    .Where(p => p.PostIsPublished)
    .GroupBy(p => new ArchiveMonthViewModel
    {
        Year = p.PostDatePublished.Year,
        Month = p.PostDatePublished.Month
    })
    .Select(a => a.Key)
    .ToList();

archiveViewModels теперь именованный тип: List<ArchiveMonthViewModel>, который вы можете вернуть из вашего метода:

public IEnumerable<ArchiveMonthViewModel> SelectPostsByDate()
{
    // code above ...
    return archiveViewModels;
}

Теперь ваше частичное представление должно основываться на модели типа IEnumerable<ArchiveMonthViewModel> (а не IEnumerable<Post>). В цикле foreach (@For Each item In Model) вы извлекаете элементы ArchiveMonthViewModel, которые сейчас являются item в цикле, а затем создаете ссылку действия, используя item.Year и item.Month.

(Надеюсь, вы сможете перевести этот эскиз на VB.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...