2017-02-01 82 views
3

有沒有辦法準確地轉換成以下SQL查詢LINQ轉換嵌套的SQL查詢LINQ查詢

SELECT * FROM T1 
WHERE ColumnA IN (
    SELECT FkColumnA FROM T2 
    WHERE FkColumnB IN (
     SELECT ColumnB FROM T3 
     WHERE FkColumnC IN (
      SELECT ColumnC FROM T4 
      WHERE FkColumnD = 1)) AND FkColumnE is null AND ColumnF = 0) 

而且,沒有人知道任何文檔,其中任何邏輯或指引,將SQL查詢轉換爲LINQ的佈局?

編輯1:

以上使用加入將是如下等效爲:

select * from T1 a 
inner join T2 b on a.FKColumnA = b.ColumnA 
inner join T3 c on c.ColumnB = b.FkColumnB 
inner join T4 d on d.ColumnC = c.FkColumnC 
where a.FkColumnD is null and a.ColumnE = 0 
and d.ColumnC = 1 

,它的等效LINQ查詢是

var linq = from q in context.T1 
      join r in context.T2 
      on q.FKColumnA equals r.ColumnA 
      join s in context.T3 
      on r.FkColumnB equals s.ColumnB 
      join t in context.T4 
      on s.FkColumnC equals t.ColumnC 
      where q.FkColumnD != null && q.ColumnE == false && t.ColumnC == 56816 
      select q.FkColumnF; 

但使用JOINS看起來有點m礦石更簡單,更好在LINQ。因此,這個問題僅僅是爲了我的知識目的。

+0

你使用'IN'子句而不是'JOIN's的原因是什麼? –

+0

沒有具體原因。我也可以用JOINS來做到這一點。這只是我的知識,因爲我知道如何將SQL轉換爲LINQ –

回答

2

翻譯查詢從字面上看,我們得到以下LINQ聲明:

var results = table1.Where(t1 => table2.Where(
     t2 => 
      table3.Where(
        t3 => 
         table4.Where(t4 => t4.FkColumnD == 1) 
          .Select(t4 => t4.ColumnC) 
          .Contains(t3.FkColumnC)) 
       .Select(t3 => t3.ColumnB) 
       .Contains(t2.FkColumnB) && !t2.FkColumnE.HasValue && t2.ColumnF == 0) 
    .Select(t2 => t2.FkColumnA) 
    .Contains(t1.ColumnA)); 

這導致IEnumerable<T1>它可以根據需要使用。

據我所知在轉換語法上沒有「文檔」,作爲開發人員,這是您的工作。但是,我個人發現LINQPad構建LINQ語句時非常有用。