2011-11-20 2 views
3

나는이 코드를 발견했지만 많은 변환을 시도한 후에도 작동하지 않습니다. 기본적으로 Datatable을 똑똑하게 직렬화 할 수있는 List로 변환합니다.일반 유형의 Linq 유형 변환

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 }; 
} 

나는 등 많은 변환을 시도 :

오류는 그것이이 Dictionary<string, object>List<object> A를 변환 할 수 있다는 것입니다

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)에는 형식이 언급되어 있지 않지만 [생성자는 실제로 a List '] (http://www.telerik.com/help/aspnet-ajax/allmembers_t_telerik_web_ui_gridbindingdata.html) – sehe

+0

그렇습니다. 웹 서비스와 클라이언트 측 바인딩을 중심으로 재생되는 telerik 그리드입니다. 솔직히 말해서, 나는 모든 Datatable을 클래스 또는 동적 유형으로 수동으로 작성하려고하지 않을 것입니다. 스 니펫 주장을 게시 한 작성자로서 이것이 효과가 있었다면 테이블이라고 부르는 완벽한 방법이었을 것입니다. –

+0

문제가 표시되지 않습니다 (업데이트 된 답변 참조). _error_가 무엇입니까? – sehe

답변

6

mm. 그것은 당신이지고 어떤 오류를 쉽게 아니지만, 아마 당신은 필요 .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();