2013-03-27 153 views
2

我想LINQ查询的数据表,以选择具有特定ID的名称,但它返回名称的长度不是字符串,这里是一些示例代码:LINQ查询数据表中返回不正确的结果

private void btnShow(object sender, EventArgs e) 
    { 
     DataTable CL = new DataTable(); 
     DataRow rt; 
     CL.Columns.Add(new System.Data.DataColumn("ID", typeof(string))); 
     CL.Columns.Add(new System.Data.DataColumn("Name", typeof(string)));   

     for (int i = 0; i< dataGridView1.Rows.Count; i++) 
     { 

      rt = CL.NewRow(); 
      rt[0] = dataGridView1.Rows[i].Cells[0].Value.ToString(); 
      rt[1] = dataGridView1.Rows[i].Cells[1].Value.ToString(); 
      CL.Rows.Add(rt); 
     } 

     var results = from myRow in CL.AsEnumerable() 
        where myRow.Field<string>("ID") == "1" 
        select myRow.Field<string>("Name").ToString(); 

     dataGridView2.DataSource = results.ToList(); 

    }  

thanx

+3

事先您的数据表中有什么内容? – LukeHennerley 2013-03-27 11:36:52

+0

只有两列ID和名称 – user2102572 2013-03-27 11:38:17

+0

由于返回数据本身就是字符串,所以在末尾不需要'ToString()'。 – 2013-03-27 11:38:22

回答

0

我怀疑Value正在返回您没有怀疑的值。

首先,尝试:

for (int i = 0; i< dataGridView1.Rows.Count; i++) 
{ 
    rt = CL.NewRow(); 
    string value1 = dataGridView1.Rows[i].Cells[0].Value; 
    string value2 = dataGridView1.Rows[i].Cells[1].Value.ToString(); 
    //Breakpoint here, check the values of value1 and value2 
    CL.Rows.Add(rt); 
} 

我也想试试您的查询的不同变化。

string[] names = dt.Rows.Cast<DataRow>().Where(row => row["Id"] == 1).Select(row => row["Name"].ToString()).ToArray(); 

然后检查此时的名称。请回复第一部分答案的结果以查看这些值是什么。

+0

卢克先生首先当我在该特定线路上设置断点时,即使没有ToString(),也会引用id = 1。 – user2102572 2013-03-27 12:04:05

+0

顺便说一下,我应用了你的查询,它只是绑定名为“Length”的列而没有任何行 – user2102572 2013-03-27 12:05:42

+0

“value1”和“value2”分别是什么值? – LukeHennerley 2013-03-27 12:16:22

0
private void btnShow(object sender, EventArgs e) 
{ 
    DataTable CL = new DataTable(); 
    DataRow rt; 
    DataTable dt = new DataTable(); 
    DataRow row; 
    CL.Columns.Add(new System.Data.DataColumn("ID", typeof(string))); 
    CL.Columns.Add(new System.Data.DataColumn("Name", typeof(string)));   

    for (int i = 0; i< dataGridView1.Rows.Count; i++) 
    { 

     rt = CL.NewRow(); 
     rt[0] = dataGridView1.Rows[i].Cells[0].Value.ToString(); 
     rt[1] = dataGridView1.Rows[i].Cells[1].Value.ToString(); 
     CL.Rows.Add(rt); 
    } 

    IEnumerable<DataRow> results = from myRow in CL.AsEnumerable() 
            where myRow.Field<string>("ID") == "1" 
            select myRow; 

      foreach (var re in results) 
      { 
       row = dt.NewRow(); 
       dt.Rows.Add(st.Field<string>("Name")); 
      } 
    dataGridView2.DataSource = dt; 

}