.net LINQ到数据表

.net LINQ到数据表,.net,linq,.net,Linq,我有一个大的DataTable,我想把这个DataTable的子集表示为DataTable。 简要说明如何在DataTable中选择特定列 我试过这样的东西,但没用 DataTable dTable = new DataTable(); ... ... ... DataTable dt = from field in dTable where field.Field<string>("Manager")

我有一个大的DataTable,我想把这个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 dTable=newdatatable();
...
...
...
DataTable dt=数据表中的from字段
其中field.field(“经理”)
where field.field(“电话”)
选择字段;

也许我的代码是错误的,我如何从一个数据表到另一个数据表获取“managers”和“Phone”列而不循环使用它呢?

参考数据表扩展-

然后

var whatever = dTable.AsEnumerable();
然后根据MSDN示例

var productNames = from products in table.AsEnumerable() 
      select products.Field<string>("ProductName");
var PRODUCTNAME=来自表中的产品。AsEnumerable()
选择产品。字段(“产品名称”);
编辑/更新:不幸的是,我不认为有一个内置的直接转换回具有不同模式的数据表。您有使用数据表吗?我相信。。。因为重构和测试代码可能会花费太多的精力。祝你好运,让我们保持联系,因为使用强类型列表更有趣。

你可以写:

  var query = from row in dTable.AsEnumerable()
      select new
      {
         manager = row.Field<string>("Manager"),
         phone = row.Field<string>("Phone")                         
      };
var query=来自dTable.AsEnumerable()中的行
选择新的
{
经理=行字段(“经理”),
电话=行字段(“电话”)
};

您可以在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)));
    }
DataSet ds=新数据集();
DataTable dt=新的DataTable();
数据列dc;
数据行dr;
ds.DataSetName=“产品”;
dt.TableName=“产品”;
dc=新的数据列(“product_id”,long.MaxValue.GetType());
dt.Columns.Add(dc);
dc=新数据列(“产品名称”);
dt.Columns.Add(dc);
dr=dt.NewRow();
dr[“产品标识”]=1;
dr[“产品名称”]=“监视器”;
dt.Rows.Add(dr);
dr=dt.NewRow();
dr[“产品标识”]=2;
dr[“产品名称”]=“鼠标”;
dt.Rows.Add(dr);
dr=dt.NewRow();
dr[“产品标识”]=3;
dr[“产品名称”]=“键盘”;
dt.Rows.Add(dr);
dr=dt.NewRow();
dr[“产品标识”]=4;
dr[“产品名称”]=“液晶显示器”;
dt.Rows.Add(dr);
ds.Tables.Add(dt);
IEnumerable objResult1=来自dt.AsEnumerable()中的tbl

tbl.字段(0)的位置您正在访问什么?SQL?CLR对象?你能告诉我你的目的是什么吗?通过你当前的代码我不明白你想要什么(两个嵌套的
在哪里
?)可能重复我的代码可能是错误的,我如何从一个数据表到另一个数据表获得“managers”和“Phone”列而不循环思考它?野山羊,我一直在找你…谢谢克里斯!但我必须得到一个小的数据表作为结果。@WildGoat:这就是你要找的。不幸的是,结果数据表必须与原始数据表具有相同的模式(字段)。总之,这是不可能的。长版本也适用于任何类型的匿名类型: