2014-05-14 115 views
3

我收到以下錯誤。我GOOGLE了它的一天多時間,但我不能找到確切的解決方案,請幫我謝謝無法將類型'System.Collections.Generic.List <System.Collections.Generic.IEnumerable <xxx>>'隱式轉換爲'System.Collections.Generic.List <xxx>

ERROR: Cannot implicitly convert type System.Collections.Generic.List<System.Collections.Generic.IEnumerable<ADCO.eJMC.EntityDataModel.ShareholderUser>> to System.Collections.Generic.List<ADCO.eJMC.EntityDataModel.ShareholderUser>

我用下面的代碼

List<ShareholderUser> list = new List<ShareholderUser>(); 
list = dataContext.EJMCShareholderApprovals 
        .Include(s => s.Shareholder.ShareholderUsers) 
        .Where(e => e.EJMCRequestId == requestId) 
        .Select(s => s.Shareholder.ShareholderUsers 
           .Where(x => x.AccessMode == true)) 
        .ToList(); 

回答

11

問題是,此刻,您正在選擇一系列序列 - 每個股東的股東用戶項目的一個序列。如果您只想要一個ShareholderUser項目列表,您需要將結果展平。這很容易使用SelectMany完成,在這種情況下,它實際上可以替代您的Select呼叫。

List<ShareholderUser> list = dataContext.EJMCShareholderApprovals 
           .Where(e => e.EJMCRequestId == requestId) 
           .SelectMany(s => s.Shareholder.ShareholderUsers) 
           .Where(x => x.AccessMode == true) 
           .ToList(); 

請注意,如何在多行中打破查詢使讀取也變得更加簡單。另外,如果你立即給它一個不同的值,將list變量初始化爲毫無意義。我還刪除了Include調用,因爲這是不必要的 - 您在查詢中明確選擇Shareholder.ShareholderUsers,因此您不需要包含它。

+0

我認爲''包括(s => s.Shareholder.ShareholderUsers)'行是多餘的,因爲我們選擇's.Shareholder.ShareholderUsers':無論如何:http://msdn.microsoft.com/en-us/library/ bb738708.aspx – Kobi

+0

@Kobi:我會將其添加爲評論,但我對EF沒有足夠的瞭解,無法自信地陳述它...... –

+0

如果您僅使用所選內容,則無需添加包含。只有當你想*包含*特定的上下文,否則會被延遲加載。 –

0

這應該這樣做?

var list = dataContext.EJMCShareholderApprovals 
       .Include(s => s.Shareholder.ShareholderUsers) 
       .Where(e => e.EJMCRequestId == requestId) 
       .Select(s => s.Shareholder.ShareholderUsers 
       .Where(x => x.AccessMode == true)).ToList(); 

雖然您正在選擇ShareHolderUsers?您是想獲取ShareHolderUsers的列表或ShareHolderUsers列表的列表嗎?

.Select(s => s.Shareholder.ShareholderUsers 
+2

這將編譯,但我不認爲它會做OP的要求。他們明確指定'list'類型的事實表明他們知道他們想要什麼類型......你已經有效地改變了'list'的類型,只留下查詢。我相信關鍵是要改變查詢。 –

相關問題