【问题标题】:LINQ to DataTableLINQ 到数据表
【发布时间】:2012-04-30 10:43:51
【问题描述】:

我有大数据表,我也想将此数据表的子集表示为数据表。 简单说一下如何选择 DataTable 中的特定列。

我正在尝试这样的事情,但它不起作用......

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

也许我的代码有误,我如何在不循环的情况下将“经理”和“电话”列从一个 DataTable 获取到另一个 DataTable?

【问题讨论】:

  • 你在访问什么? SQL? CLR 对象?
  • 您能说一下您帮助您的目的是什么,您当前的代码我无法理解您想要什么(两个嵌套的where?)
  • 也许我的代码有误,如何在不循环的情况下将“经理”和“电话”列从一个 DataTable 获取到另一个 DataTable?
  • 野山羊,我一直在找你……

标签: .net linq


【解决方案1】:

引用 DataTableExtensions -

http://msdn.microsoft.com/en-us/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 结果。
  • @WildGoat: CopyToDataTable 就是您要找的。不幸的是,生成的 DataTable 必须与原始 DataTable 具有相同的架构(字段)。简而言之:这是不可能的。也适用于任何匿名类型的长版本:stackoverflow.com/a/9259348/284240
【解决方案2】:

你可以写:

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

【讨论】:

    【解决方案3】:

    您可以借助 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)));
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-16
      • 2015-10-30
      • 1970-01-01
      • 2013-10-27
      • 1970-01-01
      • 1970-01-01
      • 2011-05-10
      • 1970-01-01
      相关资源
      最近更新 更多