2013-09-10 52 views
2

我有一個模型版本。這包含的信息包含一個文檔的唯一版本。將LINQ查詢擬合成模型

在我看來模式我把它就像這樣:

public virtual ICollection<IPACS_Version> rejectionList { get; set; } 

所以我現在可以有版本文檔的集合。

這裏是LINQ:

model.rejectionList = (from v in db.IPACS_Version 
         join d in db.IPACS_Document 
         on v.documentID equals d.documentID 
         where v.dateRejected != null && (d.createdBy == currUser || d.requester == currUser) 
         select v); 

這是給我下面的錯誤:

無法隱式轉換類型 'System.Linq.IQueryable' 到 '了System.Collections.Generic.ICollection'。存在明確的轉換(你是否缺少演員?)

該行可以返回給我0到很多「版本」。所以我認爲我不能正確理解的是,這個LINQ查詢不能適合我的版本模型,因爲查詢返回0到很多版本?

回答

2

LINQ查詢返回IQueryable<T>,而您要求它的類型爲ICollection<T>。這兩個界面非常獨特,您需要將它們融入一種本質。如果說從技術上說,你需要兌現IQueryable<T>成某種在內存中的數據的序列,這將允許它的成員的添加和刪除(ICollection接口抽象的性質)

快速的解決辦法是在末尾添加ToList查詢

model.rejectionList = (from v in db.IPACS_Version 
         join d in db.IPACS_Document 
         on v.documentID equals d.documentID 
         where v.dateRejected != null && (d.createdBy == currUser || d.requester == currUser) 
         select v).ToList(); 

因爲IList工具ICollection<T>,這應該能正常運行。

1

定義你的財產IEnumerable<T>

public virtual IEnumerable<IPACS_Version> rejectionList { get; set; } 
+0

這比ToList()更好嗎? –

+0

是的,因爲你不必迭代。相反,你可以推遲它,直到你真的需要它。 – Habib

1

如果你不能改變使用IEnummerable<T>而非ICollection<T>,那麼最簡單的方式來解決您的問題是調用ToList最終查詢您的視圖模型。 List<T> implements ICollection<T>

+0

一個比另一個更好嗎? –

+0

@詹姆斯威爾遜 - 一個不一定比另一個好。這完全取決於您的需求以及代碼的工作方式。在不知道細節的情況下,我無法判斷。但是,一般來說,如果'IEnumerable '滿足您的需求,請使用它。另外,你必須考慮你的數據上下文。如果你使用'IEnumerable ',你可能會遇到在獲取結果之前處理你的上下文的情況。 –

+0

@JustinNiessner一個更實用的問題 - 你練習'IQueryable '的任務'IEnumerable '? IQueryable通常意味着一些遠程的非物質數據,這些數據超出了本地內存。如果您通過IEnumerable引用它並將其公開給公共API,那麼您在某種意義上欺騙了您的客戶。 –