Linq on DataTable: выберите конкретный столбец в datatable, а не всю таблицу
я запускаю запрос LINQ на datatable
в C#.
Я хочу выбрать определенные столбцы, а не всю строку и ввести результат в datatable
. Как я могу это сделать??
Мой Код:
public DataTable getConversions(string c_to, string p_to)
{
var query = from r in matrix.AsEnumerable()
where r.Field<string>("c_to") == c_to &&
r.Field<string>("p_to") == p_to
select r;
DataTable conversions = query.CopyToDataTable();
5 ответов
Если вы уже знаете заранее, сколько столбцов будет иметь ваш новый DataTable, вы можете сделать что-то вроде этого:
DataTable matrix = ... // get matrix values from db
DataTable newDataTable = new DataTable();
newDataTable.Columns.Add("c_to", typeof(string));
newDataTable.Columns.Add("p_to", typeof(string));
var query = from r in matrix.AsEnumerable()
where r.Field<string>("c_to") == "foo" &&
r.Field<string>("p_to") == "bar"
let objectArray = new object[]
{
r.Field<string>("c_to"), r.Field<string>("p_to")
}
select objectArray;
foreach (var array in query)
{
newDataTable.Rows.Add(array);
}
здесь я получаю только три определенных столбца из mainDataTable и использую фильтр
DataTable checkedParams = mainDataTable.Select("checked = true").CopyToDataTable()
.DefaultView.ToTable(false, "lagerID", "reservePeriod", "discount");
LINQ очень эффективен и прост в использовании в списках, а не в DataTable. Я вижу, что вышеуказанные ответы имеют цикл (for, foreach), который я не буду предпочитать.
поэтому лучше всего выбрать пертикулярный столбец из DataTable-просто использовать DataView для фильтрации столбца и использовать его по своему усмотрению.
найдите здесь, как это сделать.
DataView dtView = new DataView(dtYourDataTable);
DataTable dtTableWithOneColumn= dtView .ToTable(true, "ColumnA");
теперь DataTable dtTableWithOneColumn содержит только один столбец (ColumnA).
попробовать доступ к DataTable самый простой способ что может помочь вам получить идеальную идею для доступа к DataTable, DataSet с помощью Linq...
рассмотрим следующий пример, предположим, что у нас есть DataTable, как показано ниже.
DataTable ObjDt = new DataTable("List");
ObjDt.Columns.Add("WorkName", typeof(string));
ObjDt.Columns.Add("Price", typeof(decimal));
ObjDt.Columns.Add("Area", typeof(string));
ObjDt.Columns.Add("Quantity",typeof(int));
ObjDt.Columns.Add("Breath",typeof(decimal));
ObjDt.Columns.Add("Length",typeof(decimal));
здесь выше код для DatTable, здесь мы предполагаем, что в этом DataTable доступны некоторые данные, и мы должны привязать представление сетки, обработав некоторые данные, как показано ниже.
площадью | количество | дыхание | длина | цена = количество * дыхание *длина
чем мы должны запустить следующий запрос, который даст нам точный результат, так как мы хотим.
var data = ObjDt.AsEnumerable().Select
(r => new
{
Area = r.Field<string>("Area"),
Que = r.Field<int>("Quantity"),
Breath = r.Field<decimal>("Breath"),
Length = r.Field<decimal>("Length"),
totLen = r.Field<int>("Quantity") * (r.Field<decimal>("Breath") * r.Field<decimal>("Length"))
}).ToList();
мы просто должны назначить эту переменную данных в качестве источника данных.
С помощью этого простого запроса Linq мы можем получить все наши принимает, а также мы можем выполнить все другие запросы LINQ с этим...
оператор select возвращает последовательность анонимного типа, а не последовательность потоков данных. CopyToDataTable () доступен только на IEnumerable<T>
здесь T
является или происходит от DataRow
. Вы можете выбрать r
объект строки для вызова CopyToDataTable на нем.
var query = from r in matrix.AsEnumerable()
where r.Field<string>("c_to") == c_to &&
r.Field<string>("p_to") == p_to
select r;
DataTable conversions = query.CopyToDataTable();
вы можете выполнить CopyToDataTable где общий тип T не является DataRow.