Как использовать 'IN' в DataTable

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

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

Как я могу перевести это с помощью DataTable?

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

3 ответа

Решение

Ты не можешь но вы можете сделать это через 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 США
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, это очень быстро и соответствует стандартам.

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

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