基本上,我们的想法是将来自一个DataTable的数据与另一个DataTable进行匹配。 在第一个DT中,我在一行中有20个不同的列,我从中创建一个数组,并且还有另一个DT,其中包含数千行,每行两列。我需要选择第二个DT中所有那些在数组中所有20个不同变量中找到的行(所以,我在第一个表中逐行)。
我可以在一个查询中执行此操作吗?
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#的新手。 谢谢你的帮助。
答案 0 :(得分:2)
您可以将数据表转换为可枚举,并使用LINQ过滤数据。
这样的事情:
var filtered = dt2.AsEnumerable().Where(m => numbers.Contains(m.Col1) && numbers.Contains(m.Col2))
;
答案 1 :(得分:1)
您可以在DataTable
上使用此SQL:
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值是否在数组中。
答案 2 :(得分:1)
上述两种方法都运作良好。但是,在不知道您的DataSet是否是强类型的情况下(使用单个查询而不是要求将dt1投影到数组中):
var filtered = dt2.AsEnumerable().Where(row => dt1.Rows[0].ItemArray.Contains(row[0]) ||
dt1.Rows[0].ItemArray.Contains(row[1]));