LINQ-запрос к DataTable.DataSource - PullRequest
3 голосов
/ 23 марта 2010

Я пытаюсь выполнить запрос LINQ для DataTable и показать результат в другой DataTable. Мой исходный DataTable выглядит примерно так:

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>. Любая помощь будет оценена.

Ответы [ 2 ]

4 голосов
/ 23 марта 2010

Когда вы выбираете новый {}, вы фактически получаете IEnumerable<(Anonymous Type)>, а не IEnumerable<DataRow>. Таким образом, ваш as IEnumerable<DataRow> вернет ноль, поскольку он не может быть напрямую разыгран.

Либо select new MyDataRow(constructor using values...) или что-то, либо просто сделайте var query =... без as приведения. Есть msdn статья об использовании CopyToDataTable с универсальным параметром, отличным от DataRow, хотя я не читал его подробно, но выбор новых DataRows, вероятно, является более простым решением.

0 голосов
/ 24 марта 2010

Почему вы должны создать новый анонимный тип.Когда вы можете просто сделать это.

</p>

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

<pre><code>        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();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...