2013-12-11 36 views
3

我想獲得一個特定的LINQ結果集,並進行分組。如何將LINQ組和訂單與父表和子表結合起來?

我有兩個模型,GalleryMedia。畫廊包含媒體。

GalleryMedia對象都由名爲SortOrder的鍵(列)排序。

我試圖做一個選擇返回所有的媒體在一組的畫廊,但媒體必須是:

  1. GalleryId(圖庫鍵)
  2. 畫廊通過有序分組Gallery.SortOrder
  3. 通過Media.SortOrder

下令媒體所以結果集看起來像:

Gallery 1 
Media 1 
Media 2 
Media 3 
Gallery 2 
Media 1 
Media 2 
Media 3 
Gallery 3 
Media 1 
Media 2 
Media 3 

我目前有:

var EventGalleries = from g in db.Galleries 
        where g.EventId == id 
        orderby g.SortOrder 
        select g.GalleryId; 

var EventMedia = from m in db.Media 
       where EventGalleries.Contains(m.GalleryId) 
       orderby m.SortOrder ascending 
       select m; 

所以現在我需要通過EventGalleries.SortOrder屬性重新排序或組的EventMedia列表。

EventGalleries數組已經按照正確的順序,我現在確定EventMedia將以這種方式正確地排序/分組。

回答

3

您可以嘗試使用JoinGroupBy在一個查詢中這樣做:

var result = db.Media 
    .OrderBy(m => m.SortOrder) 
    .GroupBy(m => m.GalleryId) 
    .Join(
     db.Galleries, 
     group => group.Key, 
     g => g.GalleryId, 
     (group, g) => new { Gallery = g, Media = group }) 
    .OrderBy(x => x.Gallery.SortOrder); 

這裏是一個working demo

+1

只是要注意,上面只能當你能保證所有的畫廊至少有1種介質。如果有一個沒有媒體的畫廊'g3',輸出中缺少'g3'。見工作演示的叉子。 http://ideone.com/RWgaxt –

1

試試這個,它會給你你想要什麼:

var items = (from g in db.Galleries 
        group g by g.GalleryId into k 
        orderby g.SortOrder 
         select new 
         { 
          Gallery = k.Key, 
          Medias = (from m in db.Media 
             where m.GalleryId == k.Key 
             orderby m.SortOrder 
             select m).ToList() 
         }); 

      foreach (var g in items) 
      { 
       Console.Writeline(g.Gallery); 
       foreach (var m in g.Medias) 
       { 
        // write your media properties here 
       } 

      } 
1

假設GalleryMedia屬性,列出其Media孩子,你可以寫一個簡單的迭代方法:

IEnumerable<object> GetGalleriesAndMedia(int eventId) 
{ 
    foreach (var gallery in from g in db.Galleries 
          where g.EventId == eventId 
          orderby g.SortOrder 
          select g) 
    { 
     yield return gallery; 
     foreach (var media in gallery.Media.OrderBy(m => m.SortOrder)) 
      yield return media; 
    } 
} 

如果你沒有這樣的財產,你可以手動查看:

IEnumerable<object> GetGalleriesAndMedia(int eventId) 
{ 
    var eventGalleries = (from g in db.Galleries 
         where g.EventId == eventId 
         orderby g.SortOrder 
         select g).ToList(); 
    var eventGalleryIds = eventGalleries.Select(x => x.GalleryId).ToList(); 
    var eventMedia = (from m in db.Media 
         where eventGalleryIds.Contains(m.GalleryId)       
         orderby m.SortOrder ascending 
         select m).ToLookup(x => x.GalleryId); 
    foreach (var gallery in eventGalleries) 
    { 
     yield return gallery; 
     foreach (var media in eventMedia[gallery.GalleryId].OrderBy(m => m.SortOrder)) 
      yield return media; 
    } 
} 

無論哪種方式,你會得到一個列表中Gallery S和Media的:

Console.WriteLine(string.Join(Environment.NewLine, GetGalleriesAndMedia(1))); 
// outputs 
Gallery 1 
Media 1 
Media 2 
Media 3 
Gallery 2 
Media 1 
Media 2 
Media 3 
Gallery 3 
Media 1 
Media 2 
Media 3 
相關問題