2017-07-04 37 views
1

我發送了這個難得的查詢,我真的很難把它傳遞給ef,請給我一個幫助嗎?如何使用EF5中的「SELECT IN」

非常感謝你提前

SELECT 
    c.* 
FROM 
    Company c 
    JOIN [User] u ON c.id = u.id_company 
WHERE 
    (
     (u.id_usertype = 3) 
     AND 
     (u.id = 2135) 
    ) 

UNION 

SELECT 
    c.* 
FROM 
    Company c 
    JOIN Company mc ON c.id_company = mc.id 
WHERE 
    mc.id in 
    (
     SELECT 
      c.id 
     FROM 
      Company c 
      JOIN [User] u ON c.id = u.id_company 
     WHERE 
     (
      (u.id_usertype = 3) 
      AND 
      (u.id = 2135) 
     ) 
    ) 
+0

你爲什麼不使用EF6? – Dai

+2

@戴有很多原因讓人無法使用某些軟件的'x版本'。不知道這與問題 – Rob

+0

有什麼關係。您的查詢使用'WHERE IN'作爲JOIN過濾器。您的查詢可以在不使用WHERE IN語句並使用其他JOIN的情況下重寫。 – Dai

回答

2

現在你已經解釋了分公司/公司關係,我看到查詢可以改成下面的查詢:

SELECT 
    Company.* 
FROM 
    [User] 
    INNER JOIN Company ON [User].id_company = Company.id 
WHERE 
    [User].id = 2135 

UNION 

SELECT 
    SubCompany .* 
FROM 
    [User] 
    INNER JOIN Company ON [User].id_company = Company.id 
    INNER JOIN Company AS SubCompany ON Company.id = SubCompany.id_company 
WHERE 
    [User].id = 2135 

UNION基於查詢的查詢可以通過更改INNER JOIN Company As SubCompany而簡化爲下面的單個查詢,因此它使用OR,因此它與原始公司和子公司相匹配。

SELECT 
    SubCompany.* 
FROM 
    [User] 
    INNER JOIN Company ON [User].id_company = Company.id 
    LEFT OUTER JOIN Company AS SubCompany ON 
    (
     Company.id = SubCompany.id_company 
     OR 
     Company.id = SubCompany.id 
    ) 
WHERE 
    [User].id = 2135 

然而,在LINQ的你不能,如果你正在使用導航屬性(你可以,如果你使用Linq的GroupByJoin操作)使用複雜JOIN標準,所以我們必須通過Concat操作落,回UNION

我假設你已經在實體框架中定義的Company->SubCompany關係,在這種情況下,你可以使用SelectMany

var query = dbContext 
    .Users 
    .Where(u => u.id == 2135) 
    .Select(u => u.Company) 
    .Concat(
     dbContext 
      .Users 
      .Where(u => u.id == 2135) 
      .SelectMany(u => u.Company.SubCompanies) 
    ); 
+0

非常感謝,它完美的工作! –