2011-02-16 49 views
1

我不知道如何標題這個,所以如果有人可以更適當地重命名,這將不勝感激。實體框架類,擴展EF類和添加自定義屬性,iQueryable和獲取方法

我堅持我如何去填充部分實體類的自定義屬性。一些例子

// partial class from EF base class - base class contains 
// properties such as commentID, comment, userID etc 
// Comments.cs 
public partial class Comment { 

    public int UpVotes { get; set; } 
    public int DownVotes { get; set; } 

    public int CurrentVotes() 
    { 
     return UpVotes - DownVotes; 
    } 

} 

_

//CommentRepository.cs 
//snip 
public Comment GetItem(int id) 
{ 
    Comment c = db.Comments.SingleOrDefault(x => x.CommentID == id); 
    c.UpVotes = 0 //get UpVotes 
    c.DownVotes = 0 // get DownVotes 
    return c; 
} 

public IQueryable<Comment> GetAllCommentsByPage(int pageid) 
{ 
} 

public IQueryable<Comment> GetAllCommentsByPage(string slug) 
{ 
} 

public IQueryable<Comment> GetCommentSelection(int PageID, int Skip, int Take) 
{ 
} 

public int CountCommentByPage(int PageID) 
{ 
} 

在舊的.Net 1.x的日子裏,我將不得不在GetAllx方法選擇CommentIDs的列表,然後通過使用List.Add填充新的列表(的GetItem(ID))。

在EF4中,我想要做類似的事情,但不會因爲延遲執行IQueryables而失去作用。
在幾個實例中,我發現在執行最後的.ToList()或類似的獲取實際數據之前,快速連續堆疊這些GetAllx方法很有用。

有沒有一種明智的方式讓我做我想做的事情,相當簡單,避開我?我討厭不得不改變每個方法來返回一個可以通過一個GetItem方法生成的項目的靜態列表。

在此先感謝。

----- -----編輯

好吧,這裏的解決方案,我目前有:

public List<Comment> IQueryable2ToList(IQueryable<Comment> c) 
{ 
    List<Comment> comments = new List<Comment>(); 
    List<int> ids = c.Select(x => x.CommentID).ToList(); 
    foreach (int id in ids) { 
     comments.Add(GetComment(id)); 
    } 
    return comments; 
} 

這一點我做致電:

List<Comment> comments = (new CommentRepository()).IQueryable2ToList(db.FindAllCommentsByPage(slug)); 

剛剛似乎有點不知何故...

+0

你有什麼部分的代碼實際上不工作? –

+0

對不起,也許我還不清楚。沒有實質性的損失。我只是希望每個IQuerable 選擇都會返回GetItem中列出的註釋列表(使用我自定義的額外參數),而不是EF返回的股票參數。 –

回答

1

那麼,你可以消除n + 1選擇:

public List<Comment> IQueryable2ToList(IQueryable<Comment> comments) 
{ 
    List<Comment> comments = comments.ToList() 
    foreach (Comment c in comments) { 
     c.UpVotes = 0 //get UpVotes 
     c.DownVotes = 0 // get DownVotes 
    } 
    return comments; 
} 

但是,那不是我該做的。相反,我會做一個演示模型和項目:

public class CommentPresentation { 

    public int CommentID { get; set; } 
    public string WittyInsight { get; set; } 
    public int UpVotes { get; set; } 
    public int DownVotes { get; set; } 

    public int CurrentVotes() 
    { 
     return UpVotes - DownVotes; 
    } 
} 

public IQueryable<CommentPresentation> ToPresentation(IQueryable<Comment> comments) 
{ 
    return from c in comments 
      select new CommentPresentation 
      { 
       CommentId = c.CommentId, 
       WittyInsight = c.WittyInsight, 
       UpVotes = 0, 
       DownVotes = 0 
      }; 
} 

如果你想分配比恆定的其他東西,你可能要經過AsEnumerable(),所以你要首先做分頁。但是這應該讓你開始。