2016-04-26 77 views
0

我在MongoDb中有一個集合,其中包含從類「FeedItemBase」派生的對象。當我查詢這個集合時,我返回一個FeedItemBase對象的列表。MongoDb抽象集合和向下轉換

//This is my collection property in the RepoBase abstract 
public IMongoCollection<T> Collection { get; set; } 

//This is what my repo looks like, therefore my Collection is T = UserFeed 
public class UserFeedsRepo : RepoBase<UserFeed>, IAsyncRepo<UserFeed> 
{...The method below lives in this repo...} 

public async Task<IEnumerable<FeedItemBase>> GetFeedItems(string userId, int skip, int limit) 
{ 
    try 
    { 
     var results = await Collection 
      .Aggregate() 
      .Match(x => x.User.Id == userId) 
      .Unwind<UserFeed, UnwindedFeedItems>(x => x.Items) 
      .SortByDescending(x => x.Items.DatePosted) 
      .Skip(skip) 
      .Limit(limit) 
      .ToListAsync() 
      .ConfigureAwait(false); 
     return results.Select(x => x.Items); 
    } 
    catch (Exception ex) 
    { 
     throw new Exception("An exception occured in GetFeedItems", ex); 
    } 
} 

這很好。如果我以這種形式(DTO)將這些對象從WebApi作爲Json傳遞給我的客戶端,則它們將在客戶端使用$ type正確序列化爲其派生形式。

但是,有一點,我需要以注入這些DTO的進一些的ViewModels向下傳遞未保存在我的數據庫,在其最簡單的形式的信息:

FeedItemImage derives from FeedItemBase 
FeedItemComment derives from FeedItemBase 

之間唯一的不同這2個對象分別是「ImageUrl」和「Comment」。

我無法將FeedItemBase對象的集合轉換爲它們的具體形式,我似乎無法想到圍繞它的乾淨方法。我需要它們的具體形式,以便在注入ViewModel構造函數時,我可以訪問Comment和ImageUrl屬性。

private async Task<List<FeedItemViewModelBase>> GetFeedItemViewModels(IEnumerable<Models.DTO.Feed.FeedItemBase> feedItems) 
{ 
    try 
    { 
     List<FeedItemViewModelBase> viewModels = new List<FeedItemViewModelBase>(); 
     //This is where it is currently bombing out 
     var commentItems = (IEnumerable<Models.DTO.Feed.FeedItemComment>)feedItems.Where(x => x.ObjectType == "FeedItemComment"); 
     var imageItems = (IEnumerable<Models.DTO.Feed.FeedItemImage>)feedItems.Where(x => x.ObjectType == "FeedItemImage"); 

     //These 2 lines return populate view models to be added to the list to be returned 
     var commentViewModelsTask = GetFeedItemCommentViewModels(commentItems).ConfigureAwait(false); 
     var imageViewModelsTask = GetFeedItemImageViewModels(imageItems).ConfigureAwait(false); 

     viewModels.AddRange(await commentViewModelsTask); 
     viewModels.AddRange(await imageViewModelsTask); 

     return viewModels; 
    } 
    catch (Exception ex) 
    { 
     throw new Exception("There was a problem retrieving feed item viewmodels", ex); 
    } 
} 

有人可以幫助我嗎?或者告訴我是否有更好的方法去實現它。

在此先感謝

+1

我覺得問題是你必須分別在列表中投射每個對象。你不能將'List '轉換爲'List ',你必須'foreach(b在listOfBaseObjects){newList.Add((b作爲派生));}'。 – Quantic

+0

Doh!感謝Quantic,你是對的。我使用linq來投射每個項目 - 顯示在問題更新 – pieperu

+0

您可以在實際答案中發佈答案而不是編輯。其實我覺得他們更喜歡那個。 – Quantic

回答

0

的解決方案,Quantic指出的是在列表中投每個項目,而不是試圖投整個集合:

var commentItems = feedItems 
    .Where(x => x.ObjectType == "FeedItemComment") 
    .Select(x => (Models.DTO.Feed.FeedItemComment)x); 

由於Quantic