LINQ to DataTable

5

我有一个很大的DataTable,我想获取它的子集并将其表示为另一个DataTable。简单来说,我该如何选择DataTable中的特定列。

我尝试了下面这个方法,但它不起作用...

DataTable dTable = new DataTable();
...
...
...
        DataTable dt = from field in dTable
                       where field.Field<string>("Manager")
                       where field.Field<string>("Phone")
                       select field;

也许我的代码有问题,我该如何从一个DataTable中获取"managers"和"Phone"列到另一个DataTable而不需要循环遍历它?

你正在访问什么?SQL?CLR对象? - Tormod
你能说一下你的目的是什么吗?根据你现在的代码,我无法理解你想要什么(两个嵌套的 where?) - Saeed Amiri
1
可能是 Can we filter Datatable with LINQ? 的重复问题。 - Roger Lipscombe
也许我的代码有问题,我该如何在不循环遍历的情况下从一个 DataTable 中获取“managers”和“Phone”列到另一个 DataTable 中? - Wild Goat
1
野山羊,我一直在找你... - StronglyTyped
3个回答

6

参考 DataTableExtensions -

http://msdn.microsoft.com/zh-cn/library/system.data.datatableextensions.asenumerable.aspx

然后...

var whatever = dTable.AsEnumerable();

然后根据MSDN的示例...
var productNames = from products in table.AsEnumerable() 
      select products.Field<string>("ProductName");

编辑/更新:不幸的是,我认为没有内置的直接将不同模式的数据类型转换回DataTable的方法。您必须使用DataTable吗?我相信这可能需要进行大量的重构和测试,因此请祝你好运,并确保随时向我们报告与强类型列表一起工作更加有趣。


谢谢Kris!但我必须得到小的DataTable作为结果。 - Wild Goat
1
@WildGoat: 你要找的是CopyToDataTable。不幸的是,结果的DataTable必须与原始DataTable具有相同的模式(字段)。所以简而言之:这是不可能的。长版本也适用于任何类型的匿名类型:https://dev59.com/QEjSa4cB1Zd3GeqPD0AD#9259348 - Tim Schmelter

2

你可以编写以下代码:

  var query = from row in dTable.AsEnumerable()
      select new
      {
         manager = row.Field<string>("Manager"),
         phone = row.Field<string>("Phone")                         
      };

1

您可以通过使用AsEnumerable方法,在DataTable或DataSet的特定表上执行LINQ查询。

以下是一个示例,可能会对您有所帮助。

    DataSet ds = new DataSet();
    DataTable dt = new DataTable();
    DataColumn dc;
    DataRow dr;
    ds.DataSetName = "products";
    dt.TableName = "product";

    dc = new DataColumn("product_id",long.MaxValue.GetType());
    dt.Columns.Add(dc);

    dc = new DataColumn("product_name");
    dt.Columns.Add(dc);

    dr = dt.NewRow();
    dr["product_id"] = 1;
    dr["product_name"] = "Monitor";
    dt.Rows.Add(dr);

    dr = dt.NewRow();
    dr["product_id"] = 2;
    dr["product_name"] = "Mouse";
    dt.Rows.Add(dr);

    dr = dt.NewRow();
    dr["product_id"] = 3;
    dr["product_name"] = "KeyBoard";
    dt.Rows.Add(dr);

    dr = dt.NewRow();
    dr["product_id"] = 4;
    dr["product_name"] = "LCD";
    dt.Rows.Add(dr);

    ds.Tables.Add(dt);

    IEnumerable<DataRow> objResult1 = from tbl in dt.AsEnumerable()
                                   where tbl.Field<long>(0) <= 2
                                   select tbl;

    Response.Write("<b>Query Results 1</b>");
    foreach (DataRow row in objResult1)
    {
        Response.Write(string.Format("<br/>Product ID: {0} ,  Product Name: {1}", row.Field<long>(0), row.Field<string>(1)));
    }

    IEnumerable<DataRow> objResult2 = from tbl in ds.Tables[0].AsEnumerable()
                                   let product_name = tbl.Field<string>(1)
                                   where product_name.StartsWith("Key")
                                   || product_name.StartsWith("Mo")
                                   select tbl;

    Response.Write("<br/><br/><b>Query Results 2</b>");
    foreach (DataRow row in objResult2)
    {
        Response.Write(string.Format("<br/>Product ID: {0} ,  Product Name: {1}", row.Field<long>(0), row.Field<string>(1)));
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接