2014-11-18 4 views
0

Linq로 변환해야하는 끔찍한 SQL 문이 있습니다. 한 번에 모든 것을 수행하는 대신, 작은 조각으로 나누는 것이 더 나을 것이라고 가정하고 있습니다. 단일 쿼리에 대해 이것이 가능하지 않다면, 예를 들자면 내가 끔찍한 무언가를 시작할 수있는 곳을 찾을 수 있을까요? Linq도 이와 비슷한 것을 지원할 수 있습니까? 그렇다면이 짐승을 통해 나를 인도 할 수있는 자습서가 있습니까?Linq Primer에 대한 SQL 문

SELECT 
    Test1 = CAST(Table2.Column1 AS VARCHAR(10)) 
, Test2 = CAST(CAST(Table2.Column2 AS INT) AS VARCHAR(10)) 
, Test3 = CASE WHEN CAST(Table2.Column2 AS INT) = 0 THEN '0' ELSE CAST(CAST(CAST(Table2.Column1 AS FLOAT)/CAST(Table2.Column2 AS FLOAT)*100 AS DECIMAL(5,2))AS VARCHAR(10)) END 
, Test4 = '100' 
, Test5 = CASE WHEN CAST(Table2.Column2 AS INT) = 0 THEN 'No' WHEN CAST(Table2.Column1 AS FLOAT)/CAST(Table2.Column2 AS FLOAT)*100 > 10 THEN 'Yes' ELSE 'No' END 
FROM (
SELECT Test16 = IsNull(SUM(Table1.Column1), 0), Test15 = IsNull(SUM(Table1.Column2), 12) FROM (SELECT DISTINCT 
    a_Test6 = Table3.Column1 
, a_Test7 = 1 
, a_Test8 = IsNull(Table4.Column1+', ','')+IsNull(Table4.Column2+' ', '')+IsNull(Table4.Column3, '') 
, a_Test9 = IsNull (Table5.Column2, ' ') 
, a_Test10 = Table3.Column4 
, a_Test11 = Table6.Column4 
, a_Test12 = Case IsNull (Table3.Column2, 0) When 1 Then 1 Else 0 End 
, a_Test13 = Case IsNull (Table3.Column2, 0) When 1 Then 'Yes' Else 'No' End 
, a_Test14 = 'NAP' 
FROM Table3 
Left JOIN Table3 ON Table3.Column3 = Table3.Column3 
INNER JOIN Table5 ON Table6.Column3 = Table5.Column1 Where Table3.Column5 IN (2,3,1) AND Table3.Column6 in (9,8) AND (CAST(CAST(Table3.Column4 AS float) AS int)>=12345 And CAST(CAST(Table3.Column4 AS float) AS int)<=54321)) As Table0 
) AS a FOR BROWSE 
+1

FROM에 Table6 또는 Table2가 표시되지 않지만 둘 다 SELECT에 표시됩니다. 왜 같은 열에서 자체 테이블에 조인을 남기겠습니까? –

+2

좋은 질문입니다. 불행히도, 나는 좋은 대답이 없다 (상속 된 코드). 내가 그 조인을 해결하는 것에 대해 알게 될 것입니다. 편집 : 변경했습니다. 번역에 실수를 한 것처럼 보입니다. – razorsyntax

답변

2

내가 당신에게 먼저 기본적으로 출발점, 형식 추한 SQL을주고, 나중에 LINQ, 하나에 체인의 모든 필요를 사용하여 결합, 서브 쿼리로 그것을 깰 수 있습니다.

SELECT Test1 = CAST(Table2.Column1 AS VARCHAR(10)) , 
     Test2 = CAST(CAST(Table2.Column2 AS INT) AS VARCHAR(10)) , 
     Test3 = CASE 
        WHEN CAST(Table2.Column2 AS INT) = 0 THEN '0' 
        ELSE CAST(CAST(CAST(Table2.Column1 AS FLOAT)/CAST(Table2.Column2 AS FLOAT)*100 AS DECIMAL(5,2))AS VARCHAR(10)) 
       END, 

     Test4 = '100', 
     Test5 = CASE 
        WHEN CAST(Table2.Column2 AS INT) = 0 THEN 'No' 
        WHEN CAST(Table2.Column1 AS FLOAT)/CAST(Table2.Column2 AS FLOAT)*100 > 10 THEN 'Yes' 
        ELSE 'No' 
       END 
FROM ... 

음, 이것은 어려운 일이 SqlFunctionsConvert.ToInt32 플러스 삼항 연산자로 해결 될 수있는 캐스트입니다, 매우 간단합니다.

YourSource.Select(x => new { 
    Test1 = SqlFunctions.StringConvert(Table2.Column1, 10), 
    Test3 = Convert.ToInt32(Table2.Column2) == 0 ? "0" : <..more logic here..> 
}); 

약간 까다로운 다른 하나는 별개입니다.

(SELECT DISTINCT 
     a_Test6 = Table3.Column1 , 
     a_Test7 = 1 , 
     a_Test8 = IsNull(Table4.Column1+', ','')+IsNull(Table4.Column2+' ', '')+IsNull(Table4.Column3, '') , 
     a_Test9 = ISNULL (Table5.Column2, ' '), 
     a_Test10 = Table3.Column4 , 
     a_Test11 = Table6.Column4 , 
     a_Test12 = CASE ISNULL (Table3.Column2, 0) WHEN 1 THEN 1 ELSE 0 END , 
     a_Test13 = CASE ISNULL (Table3.Column2, 0) WHEN 1 THEN 'Yes' ELSE 'No' END , 
     a_Test14 = 'NAP' 
    FROM Table3 
    LEFT JOIN Table3 ON Table3.Column3 = Table3.Column3 
    INNER JOIN Table5 ON Table6.Column3 = Table5.Column1 
    WHERE Table3.Column5 IN (2, 3, 1) 
    AND Table3.Column6 IN (9, 8) 
    AND (CAST(CAST(Table3.Column4 AS float) AS int)>=12345 
      AND CAST(CAST(Table3.Column4 AS float) AS int)<=54321)) 

글쎄, 우리는 이미 CASE/WHEN/CAST 문제를 돌 보았으므로 이제는 문제가 없어야합니다.

IsNULL, CAST, WHEN/CASE 모든 삼항 연산자를 함께 해결할 수/SqlFunctions.StringConvert ..

테이블에 조인 왼쪽을하는 : 테이블 What is the syntax for an inner join in LINQ to SQL?

당신에 가입 LINQ to SQL Left Outer Join

내부를하는 .Distinct()과 별개입니다.

IN을 찾고있는 경우 람다 확장시 new[]{2,3,1}.Contains(Table3.Column5)을 사용하고 싶습니다.

Goodluck.

+1

그것은 확실히 올바른 방향으로 나를 가리킨다! 정말 고맙습니다! 나는 이러한 추한 쿼리 중 약 16 개를 처리해야하며 절대적으로 도움을 주셔서 감사합니다! – razorsyntax