Sous-requête Entity Framework

.net entity-framework subquery

Question

Comment écrire des sous-requêtes comme celles-ci dans EF?

select * from table1 where col1 in (select col1 from table2 where col2 = 'xyz')

ou

select * from table1 where col1 not in (select col1 from table2 where col2 = 'xyz')

J'ai essayé quelque chose comme ça

from t1 in table1
where (from t2 in table2 where col2 = 'xyz' select t2.col1).Contains(t1.col1)
select t1

et

from t1 in table1
where !(from t2 in table2 where col2 = 'xyz' select t2.col1).Contains(t1.col1)
select t1

ces requêtes fonctionnent bien LinqPad ou Linq to Sql

Réponse populaire

Ce type de sous-requête peut être ajusté à une jointure, c'est ce que je choisirais d'écrire ici:

Version SQL:

SELECT t1.col1, t1.col2, t1.col3, ...
FROM table1 t1
INNER JOIN table2 t2
    ON t1.col1 = t2.col1
WHERE t2.col2 = 'xyz'

Version Linq:

var query =
    from t1 in context.Table1
    where t1.AssociationToTable2.Col2 == "xyz"
    select new { t1.Col1, t1.Col2, ... };

AssociationToTable2 est la propriété de relation - la jointure est automatiquement effectuée. Ou, si vous n'avez pas de relation:

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, ... };

Vous pouvez les adapter en conséquence pour NOT IN , bien que je recommande de ne jamais utiliser NOT IN si vous pouvez l'éviter - les performances vont couler et cela implique presque toujours une erreur de conception.

Si vous devez absolument le faire "IN" , je vous suggère de passer en revue les réponses à cette question .



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow