Как написать подобные запросы в EF?
select * from table1 where col1 in (select col1 from table2 where col2 = 'xyz')
или же
select * from table1 where col1 not in (select col1 from table2 where col2 = 'xyz')
Я пробовал что-то подобное
from t1 in table1
where (from t2 in table2 where col2 = 'xyz' select t2.col1).Contains(t1.col1)
select t1
а также
from t1 in table1
where !(from t2 in table2 where col2 = 'xyz' select t2.col1).Contains(t1.col1)
select t1
эти запросы работают нормально LinqPad или Linq to Sql
Этот тип подзапроса может быть сведен к объединению, и я бы хотел написать его здесь:
SELECT t1.col1, t1.col2, t1.col3, ...
FROM table1 t1
INNER JOIN table2 t2
ON t1.col1 = t2.col1
WHERE t2.col2 = 'xyz'
var query =
from t1 in context.Table1
where t1.AssociationToTable2.Col2 == "xyz"
select new { t1.Col1, t1.Col2, ... };
Где AssociationToTable2
- это свойство отношения - оно выполняет объединение автоматически. Или, если у вас нет отношений:
var query =
from t1 in context.Table1
join t2 in context.Table2
on t1.Col1 equals t2.Col1
where t2.Col2 == "xyz"
select new { t1.Col1, t1.Col2, ... };
Вы можете адаптировать их для NOT IN
, хотя я бы рекомендовал никогда не использовать NOT IN
если вы можете избежать этого - производительность снизится, и это почти всегда подразумевает ошибку в дизайне.
Если вам абсолютно необходимо сделать это «IN» , я предлагаю просмотреть ответы на этот вопрос .