2010-03-23 2 views
2

Я пытаюсь выполнить запрос LINQ в DataTable и показать результат в другом DataTable. Мой источник 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>(); 

Каждый раз, когда я бегу этот кодовый запрос равен нулю. Я вижу, что 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 литых. Существует msdn article об использовании CopyToDataTable с общим параметром non-DataRow, хотя я его не читал подробно, но выбор новых DataRows, вероятно, является более легким решением.

-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 - Это не "просто"; это ** ужасный ** kludge! Как вы можете подтолкнуть этот взлом к ​​ничего не подозревающему программисту? –