2009-05-01 61 views
1

我想从一个LINQ查询返回的DataTable在运行时从我的树视图。返回的字段为:DataTable选择()与Guids

NAME = CaseNoteID |联系日期| ParentNote TYPE = Guid |日期时间| Guid

ParentNote字段与CaseNoteID列中的条目匹配。选择(过滤器)给我一个运行时错误找不到列[ea8428e4]。字母数字是Guid中的一个的第一部分。当我通过我的代码过滤器= "ParentNote=ea8428e4-1274-42e8-a31c-f57dc2f189a4"

我错过了什么?

var tmpCNoteID = dr["CaseNoteID"].ToString(); 
       var filter = "ParentNote="+tmpCNoteID; 

       DataRow[] childRows = cNoteDT.Select(filter); 

回答

6

尝试封闭GUID用单引号:

var filter = "ParentNote='"+tmpCNoteID+"'"; 
+0

哇!我觉得自己像个白痴! 谢谢!像魅力一样工作! – 2009-05-01 19:07:37

1

这应该工作:

var tmpCNoteID = dr["CaseNoteID"].ToString(); 
       var filter = "ParentNote=\""+tmpCNoteID+"\""; 

       DataRow[] childRows = cNoteDT.Select(filter); 
0

这是一个方法,我用:

  MyStrongDataSet ds = new MyStrongDataSet(); 
      Guid myUuid = new Guid("11111111-2222-3333-4444-555555555555"); 

      System.Data.DataRow[] rows = ds.MyStrongTable.Select("MyGuidProperty = (CONVERT('" + myUuid.ToString("N") + "', 'System.Guid'))"); 


      //Fish out a single row if need be and cast to a strong row 
      if (null != rows) 
      { 
       if (rows.Length > 0) 
       { 
        MyStrongDataSet.MyStrongTableRow returnRow = rows[0] as MyStrongDataSet.MyStrongTableRow; 
        return returnRow; 

       } 
      } 
      return null; 

这里是一个细微的变化:

string filterSql = "MyGuidProperty ='{0}'"; 

    filterSql = string.Format(filterSql, Guid.NewGuid().ToString("D")); 
1

我知道这是一个旧线程,但我想添加一个附录给它。当使用带Guid的IN运算符(例如:ParentNote IN(,等))时,不再接受单引号。在这种情况下,CONVERT方法(由granadaCoder建议)是必要的。 (单引号提高约一个GUID比较与“=”操作......我们实际上没有使用的字符串异常。)

详情:我继承了建有大型的过滤字符串一些旧代码格式如下:MyColumn = '11111111-2222-3333-4444-555555555555' OR MyColumn = '11111111-2222-3333-4444-555555555555' ....

当guid的数量(以及因此OR子句的数量)变得太大时,会导致堆栈溢出异常。通过用IN子句替换大量的OR子句,我可以设置过滤器而无一例外。但是使用IN子句意味着必须使用CONVERT方法。