2009-06-26 61 views
0

我遇到了DataTable行的问题,想法是我想从一系列行中抽出其中一个列值位于集合中的任何行的指导。但是,我得到了select()函数的guid/string比较错误。DataTable.Select(“ColumnName IN”)Guid error

的代码如下:

Dim sb As New StringBuilder 
For Each Row As DataRow In dtData.Rows 
    sb.Append("'") 
    sb.Append(Row("SomeField").ToString) 
    sb.Append("', ") 
Next 


gvDataView.DataSource = dtSubData.Select("SomeField IN (" & sb.ToString.TrimEnd(", ".ToCharArray) & ")") 

然而,如SomeField是一个唯一标识符列,dtSubData.select是投掷约GUID和字符串比较的误差。考虑到这一点,有什么办法可以解决这个问题?

回答

0

如果您可以使用.NET 3.5和System.Data.DataSetExtensions.dll,那么您可以在这里利用LINQ。首先,我将使用dtData中的值填充HashSet。

var items = from row in dtData.AsEnumerable() 
      select row.Field<Guid>("SomeField"); 
var validValues = new HashSet<Guid>(items); 

C#的道歉,但我的VB LINQ语法有点不稳定。无论如何,一旦你有一个有效的ID的HashSet,你可以有效地测试你的第二个DataTable中的数据是否包含在该集合中:

gvDataView.DataSource = from row in dtSubData.AsEnumerable() 
         where validValues.Contains(row.Field<Guid>("SomeField")) 
         select row;