2010-03-23 5 views
2

DataTable에서 LINQ 쿼리를 수행하고 다른 DataTable에 결과를 표시하려고합니다. 작성시LINQ Query to DataTable.DataSource

DataTable myDataTable = new DataTable(); 
myDataTable.Columns.Add("OrderID", typeof(int)); 
myDataTable.Columns.Add("Date", typeof(DateTime)); 
myDataTable.Columns.Add("UnitsPurchased", typeof(int)); 

결과의 DataTable은 다음과 같습니다 :

 
Order ID Date Units Purchased 
16548 10/15/09  250 
17984 11/03/09  512 
20349 01/11/10  213 
34872 01/15/10  175 

나의 현재 LINQ 쿼리는 다음과 같습니다

IEnumerable<DataRow> query = (from row in myDataTable.AsEnumerable() 
           where row.UnitsPurchased > 200 
           select new 
           { 
           row.OrderID, 
           row.Date, 
           row.UnitsPurchased 
           }) as IEnumerable<DataRow>; 

resultDataTable.DataSource = query.CopyToDataTable<DataRow>(); 

내가 실행할 때마다 내 소스의 DataTable이 같이 보입니다 이 코드 쿼리는 null입니다. 나는 as IEnumerable<DataRow>이 범인이라는 것을 알 수 있지만, DataTable.AsEnumerable()IEnumerable<DataRow>을 반환하기 때문에 나 이후로는 아무런 이유가 없다. 어떤 도움을 주시면 감사하겠습니다.

답변

3

새 {}을 (를) 선택하면 실제로 IEnumerable<(Anonymous Type)>이 아닌 IEnumerable<DataRow>이 아닙니다. 따라서 as IEnumerable<DataRow>은 직접 전송할 수 없기 때문에 null을 반환합니다.

select new MyDataRow(constructor using values...) 또는 무엇이든 입력하거나 var query =...as없이 전송하십시오. CopyToDataTable을 DataRow가 아닌 ​​일반 매개 변수와 함께 사용하는 것에 대해서는 msdn article이 있습니다. 깊이는 읽지 않았지만 새로운 DataRow를 선택하는 것이 더 쉬운 방법 일 것입니다.

-1

왜 새로운 익명 유형을 만들어야합니까? 언제 그렇게 할 수 있을까요?

DataTable myDataTable = new DataTable(); myDataTable.Columns.Add("OrderID", typeof(int)); myDataTable.Columns.Add("Date", typeof(DateTime)); myDataTable.Columns.Add("UnitsPurchased", typeof(int));

 var datarow1 = myDataTable.NewRow(); 
     datarow1.SetField("OrderID", 16548); 
     datarow1.SetField("Date", DateTime.Parse("10/10/09")); 
     datarow1.SetField("UnitsPurchased", 250); 

     var datarow2 = myDataTable.NewRow(); 
     datarow2.SetField("OrderID", 17984); 
     datarow2.SetField("Date", DateTime.Parse("11/03/09")); 
     datarow2.SetField("UnitsPurchased", 512); 

     var datarow3 = myDataTable.NewRow(); 
     datarow3.SetField("OrderID", 20349); 
     datarow3.SetField("Date", DateTime.Parse("01/11/10")); 
     datarow3.SetField("UnitsPurchased", 213); 

     var datarow4 = myDataTable.NewRow(); 
     datarow4.SetField("OrderID", 34872); 
     datarow4.SetField("Date", DateTime.Parse("10/01/10")); 
     datarow4.SetField("UnitsPurchased", 175); 


     myDataTable.Rows.Add(datarow1); 
     myDataTable.Rows.Add(datarow2); 
     myDataTable.Rows.Add(datarow3); 
     myDataTable.Rows.Add(datarow4); 

     var filteredTable = myDataTable.AsEnumerable().OfType<DataRow>().Where(row => row.Field<int>("UnitsPurchased") > 200).Select(r => r); 

     resultDataTable.DataSource = filteredTable.CopyToDataTable(); 

+0

-1 - 즉 없습니다 "간단한"이다; 그건 ** 끔찍한 ** 괴물입니다! 순진한 프로그래머에게 어떻게 해킹을 할 수 있습니까? –