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.