2011-03-21 125 views
3

我有客戶IEnumerable<Customer>IEnumerable的<dynamic> LINQ表達式

現在我想有從該名單上disctinct公司名稱的動態列表?

我想我可以做類似

dynamic cur = (from c in result.Customers 
         select g.CompanyName).Distinct(); 

但今天學到,我不能...... 我怎麼能建立這樣的查詢?

+0

你不能只使用var? – Manatherin 2011-03-21 11:23:44

回答

4

只要Customer類有一個成員CompanyName,你絕對可以做到以下幾點:

var companies = (from c in result.Customers 
       select c.CompanyName).Distinct(); 

沒有優勢,使用的dynamic關鍵字在var這裏,比一個事實,即它會阻止其他編譯器出現錯誤。

+1

不能這樣做:查詢表達式超過源類型'dynamic'或類型'dynamic'的連接序列是不允許的 – 2011-03-21 11:44:18

+0

我認爲你需要提供更多的上下文。什麼是'結果'?什麼是'結果。客戶'? – jdmichal 2011-03-21 11:49:09

+2

我的錯我回到了一個動態的,而不是IEnumerable 這就是爲什麼我得到了例外......這是所有的動態嘆息......謝謝無論如何......也謝謝@他的.Cast ()讓我覺得......但沒有它的作品像@ jdmichal已經描述,謝謝... – 2011-03-23 20:24:56

5

你在代碼中做什麼以及你在問題標題中問什麼是兩個不同的東西。

如果你想IEnumerable<dynamic>你必須做到以下幾點:

IEnumerable<dynamic> cur = (from c in result.Customers 
       select g.CompanyName).Cast<dynamic>().Distinct(); 

from c in result.Customers select g.CompanyName回報IEnumerable<string>
Cast<dynamic>()返回IEnumerable<dynamic>
Distinct()返回可枚舉的不同成員。

Distinct()默認使用默認的相等比較器EqualityComparer<T>。這將檢查被枚舉的類型並試圖找出如何處理它(鏈接詳細描述了這一點)。

這一切都像廣告一樣工作,除非動態處理的類型不能由默認的相等比較器處理。在這種情況下,您必須使用採用自定義相等比較器的重寫。

+0

很好的解釋。並感謝您的鏈接。 – 2011-06-27 15:33:19