使用Guids进行DataTable选择()

3
我试图在运行时从返回的LINQ查询结果中的DataTable构建我的TreeView。返回的字段如下:

名称 = CaseNoteID | ContactDate | ParentNote
类型 = Guid | DateTime | 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);
4个回答

8

尝试用单引号将 GUID 包裹起来:

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

2

我知道这是一个旧的帖子,但我想添加一些内容。当在Guid中使用IN运算符(例如:ParentNote IN ( , , etc. ))时,单引号不再被接受。在这种情况下,需要使用CONVERT方法(由granadaCoder建议)。 (单引号会引发有关将Guid与“= ”操作符比较字符串的异常...实际上我们没有使用“=”操作符。)

细节:我继承了一些遗留代码,它以以下格式构建了大型过滤器字符串:MyColumn = '11111111-2222-3333-4444-555555555555' OR MyColumn = '11111111-2222-3333-4444-555555555555' ....

当guid数量(因此OR子句数量)变得太大时,这导致堆栈溢出异常。通过用IN子句替换众多OR子句,我能够设置过滤器而没有异常。但是,使用IN子句意味着必须使用CONVERT方法。


1

这是我使用的一种方法:

            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

这应该可以工作:

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接