【问题标题】:How to include all elements of an array in a SQL query?如何在 SQL 查询中包含数组的所有元素?
【发布时间】:2013-02-13 08:43:27
【问题描述】:

基本上,这个想法是将一个 DataTable 中的数据与另一个 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# 的新手。 感谢您的帮助。

【问题讨论】:

  • 澄清一下,您想要遍历 DT1 中的每一列(20 列),并将每一列与 DT2 中每一行的两列相匹配?如果两列中的任何一列都匹配,则投影到新的 DataTable(“过滤”DT2)中?

标签: c# sql arrays linq


【解决方案1】:

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

类似这样的:

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

【讨论】:

  • 虽然这更优雅(尤其是在 C# 中),但 gzaxx 的解决方案更适合我。感谢您的快速回复 Raúl,感谢您的帮助!
【解决方案2】:

您可以在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 值是否在数组中。

【讨论】:

  • 我选择了这种方法,因为SQL在这种情况下更好,它成为了最终的解决方案。非常感谢gzaxx! :)
  • 如果你要创建一个字符串数组: String.Join(",",numbersStr) 会更容易做第一行;)
【解决方案3】:

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

var filtered = dt2.AsEnumerable().Where(row => dt1.Rows[0].ItemArray.Contains(row[0]) ||
                                               dt1.Rows[0].ItemArray.Contains(row[1]));

【讨论】:

  • Suntime 没问题,很高兴我们能提供帮助! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-25
  • 2022-11-26
  • 1970-01-01
  • 1970-01-01
  • 2013-12-28
  • 2020-12-30
相关资源
最近更新 更多