2016-06-19 1 views
1

일부 SQL 쿼리를 Linq (Entity Framework)로 변환 중입니다. 대부분의 쿼리는 정상적으로 작동하지만 다음 문제는 거의 발생하지 않습니다.SQL이 제대로 작동하는 동안 Linq 쿼리가 작동하지 않습니다.

SQL Server Management Studio에서이 쿼리를 시도하면 여러 레코드가 반환됩니다. 그것은 모든 레코드를 반환하지 않는

var checkList = from checklist in db.Checklists 
       join code in db.Codes on checklist.iCodeID equals code.iCodeID 
       where code.bDeleted == false && code.bObsolete == false 
       join codeGroup in db.CodeGroups on code.iGroupID equals codeGroup.iGroupID 
       where codeGroup.bDeleted == false && codeGroup.bInspection == true 
       join codeInspectionType in db.CodeInspectionTypeVs on checklist.LongKey.Substring(0, 6) equals codeInspectionType.InspectionTypeID.ToString() 
       where checklist.bDeleted == false 
       orderby checklist.iChecklistID 
       select new 
         { 
          checklist.iChecklistID, 
          InspectionTypeID = checklist.LongKey.Substring(0, 6).ToString() 
         }; 

만 하늘의 배열 :

SELECT 
    bDrillDown, 
    Icon 
FROM 
    dbo.Checklist 
INNER JOIN 
    dbo.Codes ON Checklist.iCodeID = Codes.iCodeID 
       AND Codes.bDeleted = 0 AND Codes.bObsolete = 0 
INNER JOIN 
    dbo.CodeGroup ON Codes.iGroupID = CodeGroup.iGroupID 
        AND CodeGroup.bDeleted = 0 AND CodeGroup.bInspection = 1 
INNER JOIN 
    dbo.CodeInspectionTypeV ON Cast(LEFT(Checklist.LongKey, 6) as int) = CodeInspectionTypeV.InspectionTypeID 
WHERE 
    Checklist.bDeleted = 0 
ORDER BY 
    iChecklistID 

내가 좋아하는 LINQ 쿼리로 변환

.

+1

하나의 조인으로 시작하여 코드를 디버깅 한 다음 다른 두 조인을 추가하여 코드가 잘못되어있는 부분을 찾으십시오. – jdweng

+0

디버깅하는 동안 전체 Linq 쿼리가 한 번 실행됩니다. 나는 어떻게해야합니까? – user3253756

+0

(1)'checklist.LongKey' (2)'codeInspectionType.InspectionTypeID' 중 ** type **은 무엇입니까? –

답변

3

문제는 일치하지 않는 조인 다음의 조건

on checklist.LongKey.Substring(0, 6) equals 
    codeInspectionType.InspectionTypeID.ToString() 

에 분명히있다 SQL 쿼리 하나.

불행히도 EF는 문자열에서 숫자로의 데이터 변환을 지원하지 않으므로 시도가 좋습니다. 그러나 문자열 값에 앞에 0이 포함 된 경우에는 작동하지 않습니다.

은 (how to sort varchar column containing numeric values with linq lambdas to Entity 유사) DbFunctions.Right 표준 기능을 사용하여 제로 (적어도 최신 EF6.1.3에서) 할 수있는 codeInspectionType.InspectionTypeID.ToString()의 결과, 왼쪽 패드에 필요, 그것이 작동되도록하려면 다음

on checklist.LongKey.Substring(0, 6) equals 
    DbFunctions.Right("00000" + codeInspectionType.InspectionTypeID, 6) 
0

결합 줄 끝에 "[별칭 이름]"을 추가하십시오. 그 후 는 어디 라인이 별명을 사용하여 그 이후 그 별명 를 사용하여 행에서 추가

from checklist in db.Checklists 
join code in db.Codes on checklist.iCodeID equals code.iCodeID into Temp1 
from t1 in Temp1 
where t1.bDeleted == false && t1.bObsolete == false 
관련 문제