實體框架子查詢

.net entity-framework subquery

如何在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到Sql

熱門答案

這種類型的子查詢可以展平為連接,這是我選擇在此處編寫它的方式:

SQL版本:

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

Linq版本:

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”方式 ,我建議在這個問題中回答這些問題



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因