9

datatable在 c# 中运行 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();
4

5 回答 5

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);
}
于 2013-01-21T02:26:35.643 回答
8

在这里,我从 mainDataTable 中仅获取三个特定列并使用过滤器

DataTable checkedParams = mainDataTable.Select("checked = true").CopyToDataTable()
.DefaultView.ToTable(false, "lagerID", "reservePeriod", "discount");
于 2013-02-18T16:01:17.537 回答
8

尝试访问 DataTable 最简单的方法,它可以帮助您获得使用 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 查询……</p>

于 2013-04-07T13:54:13.070 回答
7

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

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

在这里找到如何做到这一点。

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

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

于 2014-01-20T07:04:21.870 回答
3

您的 select 语句返回的是匿名类型序列,而不是 DataRows 序列。CopyToDataTable() 仅适用于IEnumerable<T>where Tis 或 derived from 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();

您还可以在通用类型 T 不是 DataRow 的情况下实现 CopyToDataTable 。

于 2013-01-20T08:03:05.003 回答