Linq on DataTable:选择特定列到datatable,而不是整个表

时间:2013-01-20 07:49:59

标签: c# linq datatable

我正在c#中的datatable上运行LINQ查询。

我想选择特定列而不是整行,并将结果输入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 个答案:

答案 0 :(得分:10)

如果您事先已经知道新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);
}

答案 1 :(得分:8)

这里我只从mainDataTable获取三个特定列并使用过滤器

DataTable checkedParams = mainDataTable.Select("checked = true").CopyToDataTable()
.DefaultView.ToTable(false, "lagerID", "reservePeriod", "discount");

答案 2 :(得分:6)

尝试Access DataTable easiest way,它可以帮助您获得使用Linq访问DataTable,DataSet的完美创意......

请考虑以下示例,假设我们有 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中有一些数据可用,我们必须通过处理一些数据来绑定Grid视图,如下所示。

  

区域 | 数量 | 呼吸 | 长度 | 价格=数量*呼吸*长度

我们必须触发以下查询,这将为我们提供我们想要的确切结果。

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查询...

答案 3 :(得分:6)

LINQ非常有效且易于在列表而非DataTable上使用。我可以看到上面的答案有一个循环(for,foreach),我不喜欢。

因此,从DataTable中选择特定列的最佳方法是使用DataView过滤列并根据需要使用它。

在此处查找如何执行此操作。

DataView dtView = new DataView(dtYourDataTable);
DataTable dtTableWithOneColumn= dtView .ToTable(true, "ColumnA");

现在DataTable dtTableWithOneColumn 只包含一列(ColumnA)。

答案 4 :(得分:3)

您的select语句返回一个匿名类型的序列,而不是一系列DataRows。 CopyToDataTable()仅适用于IEnumerable<T> TDataRow派生的r。您可以选择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。

{{1}}

您也可以implement CopyToDataTable通用类型T不是DataRow。