2009-10-12 91 views
5

不知道這裏有什麼問題,當我運行應用程序時,它說「不支持指定的方法」指向foreach循環中的「var result in query」。請幫助...foreach在LINQ結果不起作用

var query = from c in entities.Customer 
      select c.CustomerName; 

List<string> customerNames = new List<string>(); 

foreach (var result in query) 
{ 
    customerNames.Add(result.ToString()); 
} 

編輯:使用ToList()也給出相同的錯誤。

+0

在哪一行?唯一明顯的地方是錯誤是結果。 – 2009-10-12 17:41:17

+2

什麼是「實體」? – 2009-10-12 17:41:39

+0

做了一個Console.WriteLine(result.ToString());工作? – 2009-10-12 18:18:40

回答

5

您的錯誤的原因是範圍,這是「方法不支持」錯誤告訴你。

這通常發生在使用Linq來填充空白時。所以,我猜你的實體必須來自一個ORM工具,比如Entity Framework,而你正在使用像Linq這樣的實體。

使用linq時,您的查詢不會枚舉出來,直到您訪問它,ORM的意思是擊中數據庫或其他數據存儲庫。如果你不知道它是否存在,比如這個錯誤,這個延遲的行爲會導致一些奇怪的行爲。

但是,你有本地(非linq)代碼和你的查詢交織在一起,所以當編譯linq代碼時,linq to []編譯器不知道如何處理你的本地代碼。因此,「方法不支持」錯誤 - 它與從類外部引用私有方法基本相同,您調用的方法在當前範圍內是未知的。

換句話說,編譯器試圖編譯您的查詢並在您執行result.ToString()時命中數據庫,但不知道CustomerNames的私有變量或foreach方法的任何內容。數據庫邏輯和本地對象邏輯必須保持分離 - 在本地使用之前完全解決數據庫查詢結果。

你應該能夠把它寫這樣的:

var customerNames = entities.Customer.Select(c => c.CustomerName).ToList(); 

如果你必須保持在foreach(用於更復雜的邏輯,而不是爲這個簡單的例子),你仍然需要解決的LINQ到[]部分(通過強制它枚舉查詢結果)在涉及任何非linq代碼之前:

var query = from c in entities.Customer 
      select c.CustomerName; 

var qryList = query.ToList(); 

List<string> customerNames = new List<string>(); 

foreach (var result in qryList) 
{ 
    customerNames.Add(result.ToString()); 
} 
+0

你說得對,我正在使用實體框架。使用你的解決方案,我得到了同樣的錯誤在這一行: var qryList = query.ToList(); 感謝您的好解釋。 – 2009-10-13 14:45:56

2

你可以嘗試只使用ToList()方法而不是foreach

List<string> customerNames = query.ToList(); 
+0

這絕對是要走的路,但我看不出它是如何解決實際問題的。 – 2009-10-12 17:40:16

+0

你可能是對的,但我認爲它值得一試。 – jasonh 2009-10-12 17:40:50

+0

是的,這將是正確的方式填充查詢中的列表。儘可能簡單。 – Gart 2009-10-12 17:51:38

0

嘗試取出.ToString(),看看這是否會工作:

foreach (var result in query) 
{ 
    customerNames.Add(result); 
} 

好像,問題的根源在於內心深處LINQ到SQL查詢轉換機制。我想翻譯引擎會嘗試將.ToString()轉換成SQL,並在那裏失敗。

+0

我試過了,但仍然收到相同的錯誤。 – 2009-10-12 17:56:41

0

試試這個

var query = from c in entities.Customer 
     select c.CustomerName; 

List<string> customerNames = new List<string>(); 

query.ToList().ForEach(r=>customerNames.Add(r)); 
1

如果問題是c.CustomerNameToString()Gart mentioned我的第二個可疑的瀑布。這是你的部分類的自定義屬性嗎?

此外,異常的堆棧跟蹤必須展示什麼是不受支持的方法。