3

基本上,这个想法是将来自一个 DataTable 的数据与另一个匹配。在第一个 DT 中,一行中有 20 个不同的列,我从中创建了一个数组,还有另一个 DT 有数千行,每行两列。我需要选择在数组中所有 20 个不同变量中找到的第二个 DT 中的所有行(因此,我在第一个表中逐行查找)。

我可以在一个查询中执行此操作吗?

for (int x = 0; x < 20; x++) //this fills up the array from the 20 columns of dt1
{
   numbers[x] = Convert.ToInt16(dt1.Rows[i]["n" + (x+1)]);
}
var filtered = dt2.Select("Col1 = " + (any of the numbers[]) + " AND Col2 = " + (any of the numbers[]));

很明显,有问题的行是最后一行。我不确定是否可以这样做。

我是新来的,我也是 C# 的新手。感谢您的帮助。

4

3 回答 3

2

您可以将数据表转换为可枚举并使用 LINQ 过滤数据。

像这样的东西:

var filtered = dt2.AsEnumerable().Where(m => numbers.Contains(m.Col1) && numbers.Contains(m.Col2));

于 2013-02-13T08:49:53.860 回答
1

您可以在以下位置使用此 SQL DataTable

var numbersAsString = numbers.Select(x => x.ToString()).Aggregate((x,y) => x + "," + y);
var filtered = dt2.Select("Col1 in (" + numbersAsString  + ") AND Col2 in (" + numbersAsString  + ")");

首先,您从您的字符串创建Array如下所示的字符串:'1,3,4,5',然后在 SQL 中检查 Col1 或 Col2 值是否在数组中。

于 2013-02-13T08:51:29.253 回答
1

上述两种方法都运作良好。但是,在不知道您的 DataSet 是否为强类型的情况下(并且使用单个查询而不是要求将 dt1 投影到数组中):

var filtered = dt2.AsEnumerable().Where(row => dt1.Rows[0].ItemArray.Contains(row[0]) ||
                                               dt1.Rows[0].ItemArray.Contains(row[1]));
于 2013-02-13T09:05:11.150 回答