1

使用VBNET,MVC 3和Entity Framework來編寫我的第一個mvc應用程序 - 一個用戶博客應用程序。我正在嘗試創建一個歸檔邊欄,它將呈現類似2011年10月的內容,當用戶點擊時,他們將在十月份看到所有帖子。現在我所有的嘗試都顯示重複的日期 - 如果有10個職位在十月然後我看到十月2011年3次或我只回來一個月年組合說2011年十月。如何獲得唯一的月份和年份組合?

使用groupby with firstordefault我只得到一個月yaear組合。

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

我該如何找回與EF獨特的月度連續劇?


其他信息

我有我的存儲庫的功能。我想拉動月份和年份對,這樣即使在10月有3個帖子,我也只有一對說ocotober。 在倉庫:

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

我已經編輯我的回答。 – Slauma

回答

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形容的年份和月份團,例如:

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

那麼你不組一個匿名類型,但使用這個視圖模型類型:

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.Yearitem.Month創建操作鏈接。

(希望你能翻譯此草圖到VB。)

+0

你可以發佈等效的vbnet表達式嗎?我無法將其轉換爲vbnet –

+0

@Ashok:我也是:)我認爲Jim Wooley已經在他的答案中發佈了VB翻譯。 – Slauma

+0

行得通 - 我十月只有一個月和一年。由於我現在處理的月份和年份是int,有沒有簡單的方法將月份數字轉換爲月份名稱? –

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 
+0

現在它拋出 - 無法強制類型'System.Data.Entity.Infrastructure.DbQuery'1 [VB $匿名類型_0'2 [System.Int32,System.Int32]]'類型的對象類型'System.Collections.Generic.IEnumerable '1 [RiderDesignMvcBlog.Core.Entities.Post]」。 –

+0

我仍然收到這個匿名類型的錯誤消息。 '無法投射'System.Data.Entity.Infrastructure.DbQuery'1 [VB $ AnonymousType_0'2 [System.Int32,System.Int32]]'類型的對象來鍵入'System.Collections.Generic.IEnumerable'1 [RiderDesignMvcBlog .Core.Entities.Post]'。' –

+0

@Ashok:用上面的代碼得到這個錯誤是不可能的。你到底在做什麼?您是否正在使用現有變量'posts',它是'IEnumerable '而不是使用查詢創建新實例? '小帖子'很重要!您不能預先聲明類型變量,因爲結果類型是匿名的。 – Slauma