Как «Связать с DataTable», используя собственный класс DataTable

#c# #linq #lambda #datatable

#c# #linq #лямбда #datatable

Вопрос:

Как я могу поместить все, что выходит из этого запроса linq, в мой собственный класс DataTable?

 public class MyDataTable : DataTable
{
    public MyDataTable()
    {
        this.Columns.Add("ColumnName1");
        this.Columns.Add("ColumnName2");
        this.Columns.Add("ColumnName3");
        this.Columns.Add("ColumnName4");
    }
}
 

Мой запрос linq:

 MasterDataTable
.AsEnumerable()
.Where(rr =>
            rr.Field<string>("ColumnName1") == SelectedValue1 amp;amp;
            rr.Field<string>("ColumnName2") == SelectedValue2 amp;amp;
            rr.Field<string>("ColumnName3") == SelectedValue3 amp;amp;
            rr.Field<string>("ColumnName4") == SelectedValue4)
).Select(rr => rr);
 

Я пробовал это, но меня предупредили, что я не могу преобразовать EnumerableRowCollection в MyDataTable

 MyDataTable dt = MasterDataTable
    .AsEnumerable()
    .Where(rr =>
                rr.Field<string>("ColumnName1") == SelectedValue1 amp;amp;
                rr.Field<string>("ColumnName2") == SelectedValue2 amp;amp;
                rr.Field<string>("ColumnName3") == SelectedValue3 amp;amp;
                rr.Field<string>("ColumnName4") == SelectedValue4)
    ).Select(rr => rr);
 

Итак, затем я попытался получить все это в EnumerableRowCollection, но здесь я получаю «Встроенное утверждение не может быть декларацией или помеченным утверждением»

 EnumerableRowCollection<DataRow> selection = ConfigurationDataTable
.AsEnumerable()
.Where(rr =>
                rr.Field<string>("ColumnName1") == SelectedValue1 amp;amp;
                rr.Field<string>("ColumnName2") == SelectedValue2 amp;amp;
                rr.Field<string>("ColumnName3") == SelectedValue3 amp;amp;
                rr.Field<string>("ColumnName4") == SelectedValue4)
).Select(rr => rr);
 

Что я делаю не так?

Комментарии:

1. Имеет ли MasterDataTable те же столбцы , MyDataTable что и , или есть другие столбцы , не включенные в MyDataTable ? И если да, то почему вы чувствуете необходимость создать пользовательский класс для MyDataTable ?

2. @pwilcox, да, MasterDataTable на самом деле является просто экземпляром MyDataTable, содержащим все данные. Что касается вашего второго вопроса: я действительно думал о том же самом. По сути, я на самом деле не делаю ничего особенного. Я предполагаю, что я могу просто использовать собственный класс DataTable.

Ответ №1:

Я выбросил пользовательский класс и просто использовал собственный класс DataTable для обеих таблиц данных. Кажется, это помогает.

 DataTable dt = MasterDataTable
    .AsEnumerable()
    .Where(rr =>
                rr.Field<string>("ColumnName1") == SelectedValue1 amp;amp;
                rr.Field<string>("ColumnName2") == SelectedValue2 amp;amp;
                rr.Field<string>("ColumnName3") == SelectedValue3 amp;amp;
                rr.Field<string>("ColumnName4") == SelectedValue4)
    ).Select(rr => rr)
    .CopyToDataTable();
 

Комментарии:

1. Рад, что вы смогли это выяснить. Кстати, вы можете полностью отказаться от употребления Select .

Ответ №2:

DataTable не наследуется от IEnumerable:

https://docs.microsoft.com/en-us/dotnet/api/system.data.datatable .выберите

Вероятно, вам лучше всего создать пользовательский класс, который наследуется от IEnumerable, и создать методы для простой вставки ваших данных с помощью DataTable.

Вот как вы могли бы вручную прочитать данные:

 // Create your DataTable
var t = new DataTable();
t.Columns.Add("ColumnName1");   // Add your column names
t.Columns.Add("ColumnName2");   // (it is better to use one of the overload
t.Columns.Add("ColumnName3");   //  methods that defines the row's data type
// Create an instance of your new DataRow:
var row = t.NewRow();
// populate your data into your new row:
row["ColumnName1"] = "Bill";
row["ColumnName2"] = "Ted";
row["ColumnName3"] = "Excellent";
// add the DataRow to your DataTable
t.Rows.Add(row);
// Now retrieve the data using something that inherits from IEnumerable
var list = new List<String>();
// Loop through your DataTable to get the individual records
foreach (DataRow row1 in t.Rows) {
    // notice that above you MUST cast the row. It fails if you use "var row".
    list.Add(String.Format("{0} {1} {2}", row["ColumnName1"], row["ColumnName2"], row["ColumnName3"]));
}
// return your IEnumerable item
return list;
 

Я мог бы привести вам лучшие примеры того, как использовать DataRow для создания объекта класса IEnumerable, но это много кода. Если вам это нужно, дайте мне знать.