2013-03-27 166 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; 

}