Как использовать '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 Санкт-Петербург Россия
- Используя LINQ to Objects, мы выбираем все уникальные значения из столбца Country и объединяем значения (через string.Join) со строкой оператора фильтра IN. Для нашего примера это будут США "," Россия
- Фильтр окружающего IN с кавычками через строку. Формат: 'США', 'Россия'
- Передать фильтр 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)