2011-11-20 85 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();