2017-02-01 4 views
3

정확하게 다음 SQL 쿼리 에 LINQ변환 중첩 SQL 쿼리

또한
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 :

아래와 같이 될 것 조인 를 사용하여 위의 해당 : LINQ 쿼리가 될 것

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 

과 동등한의를

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

당신이'JOIN'보다는'IN' 조항을 사용하고있는 이유는 무엇입니까? –

+0

특별한 이유는 없습니다. 나는 또한 JOINS와 함께 할 수있다. 이것은 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 문을 작성할 때 매우 유용합니다.