Как использовать IN в DataTable - PullRequest
2 голосов
/ 20 августа 2011

У меня есть этот код в MS SQL:

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

Как я могу перевести это, используя DataTable?

Что-то вроде: table.select("column1 in column2")

Ответы [ 3 ]

2 голосов
/ 20 августа 2011

ты не можешь.но вы можете сделать это через linq + table.select:

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

ОБЪЯСНЕНИЕ: предположим, у вас есть очень простая таблица

ID CITY СТРАНА
1 NY США
2 МоскваРоссия
3 LA USA
4 Санкт-Петербург Россия

  1. Используя LINQ to Objects, мы выбираем все уникальные значения из столбца Country и объединяем значения (через string.Join) со строкой оператора фильтра IN,Для нашего примера это будут США ',' Россия
  2. оператор фильтра IN окружения с кавычками через строку. Формат: 'США', 'Россия'
  3. Передача фильтра IN в dataTable.Select ("CITY IN ('USA', 'Russia') ")

FYI:

Если вам нужно выполнить действительно классные SQL-запросы к DataTables \ DataSets, вы можете использовать NQuery это очень быстро и соответствует стандартам.

1 голос
/ 20 августа 2011

Вы можете использовать следующий запрос 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)
1 голос
/ 20 августа 2011

Предполагая, что таблицы находятся в одном и том же DataSet, вы можете добавить DataRelation к DataSet и затем получить доступ к дочерним строкам, используя 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;
...