如何在SQL查询中包含数组的所有元素?

时间:2013-02-13 08:43:28

标签: c# sql arrays linq

基本上,我们的想法是将来自一个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#的新手。 谢谢你的帮助。

3 个答案:

答案 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]));