2011-11-20 105 views
3

我找到了這段代碼,但即使在我嘗試了很多轉換後,它仍然無法正常工作。基本上它巧妙地將Datatable轉換爲可序列化的List。通用類型的Linq類型轉換

的錯誤在於,它無法轉換Dictionary<string, object>List<object>

public GridBindingData GetSomething() { 

DataTable dt = GetDatatable(); 

var columns = dt.Columns.Cast<System.Data.DataColumn>(); 

var data = dt.AsEnumerable() 
    .Select(r => columns.Select(c => new { Column = c.ColumnName, Value = r[c] }) 
    .ToDictionary(i => i.Column, i => i.Value != System.DBNull.Value ? i.Value : null)) 
    .ToList<object>(); 

return new GridBindingData() { Data = data , Count = dt.Rows.Count }; 
} 

我試過很多的轉換包括:

List<object> newdata = (List<object>)data.AsEnumerable().Cast<object>(); 

Basicaly,GridBindingData的數據屬性必須有一個List<object> 。那可能嗎?

+0

我猜這是一個Telerik的網格。有趣的是,[GridBindingData.Data屬性的文檔](http://www.telerik.com/help/aspnet-ajax/p_telerik_web_ui_gridbindingdata_data.html)沒有提及它的類型(原文如此),但[構造函數確實需要一個'列表'](http://www.telerik.com/help/aspnet-ajax/allmembers_t_telerik_web_ui_gridbindingdata.html) – sehe

+0

是的,它用於telerik網格,圍繞客戶端綁定web服務。說實話,我不想手動將每個Datatable寫入類或動態類型。如果這可以作爲張貼摘錄聲明的作者,那麼將它稱爲給它一張表格是一個完美的方式。 –

+0

我沒有看到問題(請參閱我的更新回答)。你得到的是什麼錯誤? – sehe

回答

6

嗯。這是不容易看到你做了什麼錯誤,但也許你需要.Cast<object>().ToList()

var data = dt.AsEnumerable() 
    .Select(r => columns.Select(c => new { Column = c.ColumnName, Value = r[c] }) 
    .ToDictionary(i => i.Column, i => i.Value != System.DBNull.Value ? i.Value : null)) 
    .Cast<object>() 
    .ToList(); 

編輯這應該工作得很好,在REPL測試:

csharp> new Dictionary<string, string> { {"key","value"} }.ToList().Cast<object>(); 
{ [key, value] } 

csharp> new Dictionary<string, string> { {"key","value"} }.Cast<object>().ToList();    
{ [key, value] } 
+1

調試完成後,我確實可以確認這個工作。在將其標記爲答案之前,我需要了解爲什麼它仍然失敗,請給我幾分鐘。 –

+0

@LakiLai:難道是因爲那裏有東西不可序列化嗎? – sehe

+0

那麼,因爲我們正在轉換爲一個列表,它應該是可序列化的。通過使用JavaScriptSerializer,我可以看到它工作正常,所以這個telerik組件一定不能正確讀取它。無論如何,你的代碼轉換得很好,現在問題在其他地方。感謝您的幫助和其他人。 –

0
data = dt.AsEnumerable() 
    .Select(r => columns.Select(c => new { Column = c.ColumnName, Value = r[c] }) 
    .ToDictionary(i => i.Column, i => i.Value != System.DBNull.Value ? i.Value : null)) 
    .Select(x => (object)x) 
    .ToList(); 
0

答案取決於你想要什麼結果:字典鍵,值,兩者?

假設你想要的值對象,這應該這樣做:

data = dt.AsEnumerable() 
    .Select(r => columns.Select(c => new { Column = c.ColumnName, Value = r[c] }) 
    .ToDictionary(i => i.Column, i => i.Value != System.DBNull.Value ? i.Value : null)) 
    .Select(x => (object)x.Value) 
    .ToList();