我如何只获得独特的月份和年份组合?

时间:2011-10-11 13:11:15

标签: asp.net-mvc vb.net asp.net-mvc-3 entity-framework entity-framework-4

使用VBNET,MVC 3和Entity Framework编写我的第一个mvc应用程序 - 单个用户博客应用程序。我正在尝试创建一个存档侧边栏,它将呈现类似2011年10月的内容,当用户点击时,他们将会看到10月份的所有帖子。现在我所有的尝试都显示重复的日期 - 如果10月有3个帖子,那么我会看到2011年10月3次或者我只回来一个月的组合说2011年10月。

使用groupby和firstordefault我只能回来一个月的yaear组合。

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

我怎样才能找到EF独特的月份组合?


其他信息

我在我的存储库中有这个功能。我想拉月和年对,所以我只有一对说ocotober即使10月有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 :(得分:0)

我会尝试这个(在C#中):

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

它提供了一个匿名对象列表。每个对象都有YearMonth属性 - 例如yearMonths[0].YearyearMonths[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的{​​{1}}元素,然后使用item和{{1}创建操作链接}。

(希望您可以将此草图转换为VB。)

答案 1 :(得分:0)

在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