使用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
答案 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();
它提供了一个匿名对象列表。每个对象都有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
的{{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