如何在DataTable上使用“IN”

时间:2011-08-20 15:56:34

标签: c# sql-server datatable datatable.select

我在MS SQL中有这段代码:

select * from table where column1 in (select column2 from table)

如何使用DataTable进行翻译?

以下内容:table.select("column1 in column2")

3 个答案:

答案 0 :(得分:2)

你不能。 但你可以通过linq + table.select来实现:

table.Select(string.Format("CITY in '{0}'",string.Join("','",table.Rows.OfType<DataRow>().Select(r=>r["COUNTRY"].ToString()).Distinct())))

说明: 假设你有一个非常简单的表

ID城市国家
1 NY USA
2莫斯科俄罗斯
3 LA USA
4 St Peterburg Russia

  1. 使用LINQ to Objects,我们从Country列中选择所有唯一值,并将值(通过string.Join)连接到IN过滤器语句字符串。对于我们的例子,它将是美国','俄罗斯
  2. 环绕IN过滤器语句,引号通过string.Format:'USA','Russia'
  3. 在dataTable.Select中传递IN过滤器(“CITY IN('USA','Russia')”)
  4. 供参考:

    如果您需要针对DataTables \ DataSet执行非常酷的SQL查询,您可以使用NQuery它非常快且符合标准。

答案 1 :(得分:1)

假设表位于同一个DataSet中,您可以向DataSet添加DataRelation,然后使用GetChildRows()访问子行

var relation = new DataRelation("RelationName", 
    dataSet.Tables["Parent"].Columns["Column2"], 
    dataSet.Tables["Child"].Columns["Column1"]);

dataSet.Relations.Add(relation);

var childRows = from row in dataSet.Tables["Child"].Rows
                where row.GetParentRows("RelationName").Length > 0;

答案 2 :(得分:1)

您可以使用以下LINQ to DataSets查询来获得与SQL中的查询相同的结果。

  var rows = from r1 in table.AsEnumerable()
             from r2 in table.AsEnumerable()
             where r1.Field<string>("Column1") == r2.Field<string>("Column2")
             select r1;

我假设您的示例中的列来自同一个表。如果没有,那么您只需要更改上面的表格,如下所示。

  var rows = from r1 in table1.AsEnumerable()
             from r2 in table2.AsEnumerable()
             where r1.Field<string>("Column1") == r2.Field<string>("Column2")
             select r1;

这类似于

select * from table1 where column1 in (select column2 from table2)