#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, но это много кода. Если вам это нужно, дайте мне знать.