2012-05-02 49 views
0

我有4個表中的DB:我可以在查詢中做GroupBy以避免poco類中的屬性嗎?

- News (NewsID(PK), NewsCategoryID(FK), NewsType (FK), NewsFormatID(FK), Caption, Description) 
- NewsType (NewsTypeID (PK), Caption) 
- NewsCategory(NewsCategoryID (PK), Caption) 
- NewsFormat (NewsFormatID (PK), Caption) 

我有2個POCO對象:

public class News 
{ 
    public int NewsID { get; set; } 
    public int NewsTypeID { get; set; } 
    public int NewsFormatID { get; set; } 
    public string Category{ get; set; } 
    public string Caption { get; set; } 
    public string Description { get; set; } 
} 

public class NewsCategory 
{ 
    public string Caption { get; set; } 
    public List<News> News{ get; set; } 
} 

我想打一個查詢返回列表。在查詢中,我想按他們的分類對新聞進行分組。我這樣做:

public static List<NewsCategory> GetNews() 
    { 
     using (var tc = new NewsDataContext()) 
     { 
      var dc = tc.DataContext; 
      var newsQuery= (from news in dc.News 
          join newsCategory in dc.NewsCategories on news.NewsCategoryID equals newsCategory.NewsCategoryID 
          join newsType in dc.NewsTypes on news.NewsTypeID equals newsType.NewsTypeID 
          join newsFormat in dc.NewsFormat on news.NewsFormatID equals newsFormat.NewsFormatID 
          select new News 
            { 
             NewsID = news.NewsID, 
             NewsFormatID = newsFormat.NewsFormatID, 
             Caption = news.Caption, 
             Description = news.Description, 
             Category = newsCategory.Caption 
            }); 

      return newsQuery.GroupBy(item => item.Category).Select(item => new NewsCategory 
                      { 
                       Caption = item.Key, 
                       News= item.ToList() 
                      }).ToList(); 
     } 
    } 

..這是行得通的。我的問題在於,我可以從POCO類News中刪除NewsCategory屬性,並直接在查詢中(加入後)按類別進行分組以及如何? 在此先感謝。

回答

1

您可以在News POCO中添加NewsCategory屬性,並將其隱藏/顯式加載。

查看this的帖子瞭解更多詳情。

+0

什麼信息? ... –

+0

@TomPickles,對不起,已更新。 – Shimmy

+0

我正在使用Linq2Sql。任何其他想法?我仍然希望在分組中按類別分組新聞,並且有List ,其中來自NewsCategory的Caption是屬性,我希望新聞可以分組。 – Cemsha

1

此代碼演示如何在查詢執行後加載行/列數據並對其進行整形。它不會「在數據庫中分組」,但它確實允許刪除News.Category屬性。

var query= (
from news in dc.News 
from newsCategory in news.NewsCategories 
let newsFormat = news.NewsFormat 
select new //anon type 
{ 
    NewsID = news.NewsID, 
    NewsFormatID = newsFormat.NewsFormatID, 
    Caption = news.Caption, 
    Description = news.Description, 
    Category = newsCategory.Caption 
}); 

//Load anon rows 
var rows = query.ToList(); 

//shape the anon rows into our POCSO's. 
List<NewsCategory> result = rows 
    .GroupBy(item => item.Category) 
    .Select(g => new NewsCategory() 
    { 
    Caption = g.Key, 
    News = g.Select(row => new News() 
    { 
     NewsID = row.NewsID, 
     NewsFormatID = row.NewsFormatID, 
     Caption = row.Caption, 
     Description = row.Description 
    } 
    }) 
    .ToList(); 

return result; 

沒有你不想要「的數據庫組由」一個原因。 group by的數據庫行爲是返回鍵和聚合。你需要關鍵和組合元素。爲了獲得每個組的組元素,linqtosql將使用每個組的鍵來重新查詢數據庫。這導致了很多往返行程(稱爲n + 1問題,其中n是組數,+1是獲取密鑰的查詢)。

Enumerable.GroupBy方法返回組鍵和元素 - 這正是你想要的。

+0

如果我明白,爲了刪除News.Category屬性,我必須創建匿名類型的對象,按類別分組,然後綁定到適當的POCO? – Cemsha

+0

好吧,你不需要 - 使用匿名對象。你也可以聲明那個對象。它是兩種映射(查詢映射類型 - >查詢結果類型 - > POCO) –

相關問題