Unterabfrage für Entity Framework

.net entity-framework subquery

Frage

Wie schreibe ich Unterabfragen wie diese in EF?

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

oder

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

Ich habe so etwas probiert

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

und

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

Diese Abfragen funktionieren gut LinqPad oder Linq to Sql

Beliebte Antwort

Diese Art von Unterabfrage kann auf einen Join reduziert werden. Dies ist die Art, wie ich sie hier schreiben möchte:

SQL-Version:

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

Linq-Version:

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

Wo AssociationToTable2 die Beziehungseigenschaft ist, wird der Join automatisch durchgeführt. Oder wenn Sie keine Beziehung haben:

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

Sie können diese für NOT IN entsprechend anpassen, obwohl ich empfehlen sollte, NOT IN nicht zu verwenden, wenn Sie dies vermeiden können.

Wenn Sie es unbedingt "IN" tun müssen , schlage ich vor, die Antworten in dieser Frage durchzugehen .



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum