2012-11-28 3 views
1

LEFT 대신 INNER JOIN이 생성되는 이유와 LEFT JOIN 뷰를 추가하는 대신 전체 뷰가 선택된 이유를 알고 싶습니다.왼쪽 쿼리 대신 내부 조인을 추가하는 엔터티 쿼리에 Linq 합류

여러 테이블에 걸쳐 펼쳐진 정보 테이블을 게시하려고합니다. 기본적으로 나는 날짜별로 검색하고 오늘, 어제, 이번 달에 일어나는 이벤트에 대한 모든 정보를 사용자가 무엇을 선택하든 반환하려고합니다. 쿼리가 상당히 길다. LEFT JOIN을 얻기 위해 기본 테이블을 제외하고 DefaultIfEmpty를 모든 테이블에 추가했지만 엉망이되었습니다.

using (TransitEntities t = new TransitEntities()) 
    { 
    var charters = from c in t.tblCharters 
join v in t.tblChartVehicles.DefaultIfEmpty() 
on c.Veh 
equals v.ChartVehID 
join n in t.tblNACharters.DefaultIfEmpty() 
on c.Dpt.Substring(c.Dpt.Length - 1) 
equals SqlFunctions.StringConvert((double)n.NAID) 
join r in t.tblChartReqs.DefaultIfEmpty() 
on c.ChartReqID 
equals r.ChartReqID 
join f in t.tblCharterCustomers.DefaultIfEmpty() 
on c.Dpt 
equals (f.DptID == "NONAFF" ? SqlFunctions.StringConvert((double)f.CustID) : f.DptID) 
join d in t.tblChartReqDocs.DefaultIfEmpty() 
on c.Attach 
equals SqlFunctions.StringConvert((double)d.DocID) 
join s in t.tblChartSupAttaches.DefaultIfEmpty() 
on c.SupAttach 
equals SqlFunctions.StringConvert((double)s.DocID) 
join p in (from e in t.v_EmpData select new {e.UIN, e.First, e.Last}).DefaultIfEmpty() 
on c.TakenUIN 
equals p.UIN 
where c.BeginTime > EntityFunctions.AddYears(DateTime.Now,-1) 
select new 
{ 
    ChartID = c.ChartID, 
    Status = c.Status, 
    ... 
    Website = r.Website, 
}; 
//select today's events 
gvCharters.DataSource = charters.Where(row => (row.BeginTime.Value >= midnight && row.BeginTime.Value < midnight1)); 

이 매우 복잡한 SQL 결과 : 또한

SELECT 
    ChartID, 
    c.Status, 
    ... 
    r.Website As Website, 

FROM tblChartersNew c 
    LEFT JOIN (SELECT [Dpt],[DptID] FROM [DRVRDiscipline].[dbo].[tblCharterCustomers] Where Valid=1 and DptID <> 'NONAFF' UNION SELECT Dpt, CONVERT(nvarchar,CustID) AS DptID FROM [DRVRDiscipline].[dbo].[tblCharterCustomers] Where Valid=1 and DptID = 'NONAFF') f 
    ON RTRIM(c.Dpt) = f.DptID LEFT JOIN [tskronos].WfcSuite.dbo.VP_ALLPERSONV42 p ON p.PersonNUM = c.TakenUIN 
    LEFT JOIN tblChartVehicles v ON v.ChartVehID = c.Veh 
    LEFT JOIN tblNACharter n ON CAST(n.NAID AS varchar) = RIGHT(c.Dpt, LEN(c.Dpt)-1) 
    LEFT JOIN tblChartReq r 
    ON r.ChartReqID = c.ChartReqID 
WHERE CONVERT(datetime,CONVERT(char(10),c.BeginTime,101)) = (SELECT TOP 1 CONVERT(datetime,CONVERT(char(10),BeginTime,101)) from tblChartersNew WHERE CONVERT(datetime,CONVERT(char(10),BeginTime,101)) >= CONVERT(datetime,CONVERT(char(10),GETDATE(),101)) ORDER BY BeginTime) 
    AND NOT c.ChartReqID IS NULL 
ORDER BY BeginTime, ISNULL(f.Dpt,c.Dpt) 

내가 :

SELECT 
    [Extent1].[ChartID] AS [ChartID], 
    [Extent1].[Status] AS [Status], 
    ... 
    [Join5].[Website] AS [Website], 

    FROM  [dbo].[tblCharters] AS [Extent1] 
    INNER JOIN (SELECT [Extent2].[ChartVehID] AS [ChartVehID], [Extent2].[Descr] AS [Descr] 
     FROM (SELECT 1 AS X) AS [SingleRowTable1] 
     LEFT OUTER JOIN [dbo].[tblChartVehicles] AS [Extent2] ON 1 = 1) AS [Join1] ON ([Extent1].[Veh] = [Join1].[ChartVehID]) OR (([Extent1].[Veh] IS NULL) AND ([Join1].[ChartVehID] IS NULL)) 
    INNER JOIN (SELECT [Extent3].[NAID] AS [NAID], [Extent3].[Descr] AS [Descr] 
     FROM (SELECT 1 AS X) AS [SingleRowTable2] 
     LEFT OUTER JOIN [dbo].[tblNACharter] AS [Extent3] ON 1 = 1) AS [Join3] ON ((SUBSTRING([Extent1].[Dpt], ((LEN([Extent1].[Dpt])) - 1) + 1, (LEN([Extent1].[Dpt])) - ((LEN([Extent1].[Dpt])) - 1))) = (STR(CAST([Join3].[NAID] AS float)))) OR ((SUBSTRING([Extent1].[Dpt], ((LEN([Extent1].[Dpt])) - 1) + 1, (LEN([Extent1].[Dpt])) - ((LEN([Extent1].[Dpt])) - 1)) IS NULL) AND (STR(CAST([Join3].[NAID] AS float)) IS NULL)) 
    INNER JOIN (SELECT [Extent4].[ChartReqID] AS [ChartReqID], [Extent4].[Event] AS [Event], [Extent4].[ContactName] AS [ContactName], [Extent4].[ContactPhone] AS [ContactPhone], [Extent4].[Website] AS [Website] 
     FROM (SELECT 1 AS X) AS [SingleRowTable3] 
     LEFT OUTER JOIN [dbo].[tblChartReq] AS [Extent4] ON 1 = 1) AS [Join5] ON ([Extent1].[ChartReqID] = [Join5].[ChartReqID]) OR (([Extent1].[ChartReqID] IS NULL) AND ([Join5].[ChartReqID] IS NULL)) 
    INNER JOIN (SELECT [Extent5].[CustID] AS [CustID], [Extent5].[Dpt] AS [Dpt], [Extent5].[DptID] AS [DptID] 
     FROM (SELECT 1 AS X) AS [SingleRowTable4] 
     LEFT OUTER JOIN [dbo].[tblCharterCustomers] AS [Extent5] ON 1 = 1) AS [Join7] ON ([Extent1].[Dpt] = (CASE WHEN (N'NONAFF' = [Join7].[DptID]) THEN STR(CAST([Join7].[CustID] AS float)) ELSE [Join7].[DptID] END)) OR (([Extent1].[Dpt] IS NULL) AND (CASE WHEN (N'NONAFF' = [Join7].[DptID]) THEN STR(CAST([Join7].[CustID] AS float)) ELSE [Join7].[DptID] END IS NULL)) 
    INNER JOIN (SELECT [Extent6].[DocID] AS [DocID], [Extent6].[FileName] AS [FileName] 
     FROM (SELECT 1 AS X) AS [SingleRowTable5] 
     LEFT OUTER JOIN [dbo].[tblChartReqDocs] AS [Extent6] ON 1 = 1) AS [Join9] ON ([Extent1].[Attach] = (STR(CAST([Join9].[DocID] AS float)))) OR (([Extent1].[Attach] IS NULL) AND (STR(CAST([Join9].[DocID] AS float)) IS NULL)) 
    INNER JOIN (SELECT [Extent7].[DocID] AS [DocID], [Extent7].[FileName] AS [FileName] 
     FROM (SELECT 1 AS X) AS [SingleRowTable6] 
     LEFT OUTER JOIN [dbo].[tblChartSupAttach] AS [Extent7] ON 1 = 1) AS [Join11] ON ([Extent1].[SupAttach] = (STR(CAST([Join11].[DocID] AS float)))) OR (([Extent1].[SupAttach] IS NULL) AND (STR(CAST([Join11].[DocID] AS float)) IS NULL)) 
    INNER JOIN (SELECT [Extent8].[First] AS [First], [Extent8].[Last] AS [Last], [Extent8].[UIN] AS [UIN] 
     FROM (SELECT 1 AS X) AS [SingleRowTable7] 
     LEFT OUTER JOIN (SELECT 
      [v_EmpData].[First] AS [First], 
      [v_EmpData].[Last] AS [Last], 
      [v_EmpData].[Legal] AS [Legal], 
      [v_EmpData].[Name] AS [Name], 
      [v_EmpData].[Email] AS [Email], 
      [v_EmpData].[UIN] AS [UIN], 
      [v_EmpData].[UserNM] AS [UserNM], 
      [v_EmpData].[Worker] AS [Worker], 
      [v_EmpData].[SUPERVISORNUM] AS [SUPERVISORNUM], 
      [v_EmpData].[Supervisor] AS [Supervisor], 
      [v_EmpData].[EmpArea] AS [EmpArea], 
      [v_EmpData].[Title] AS [Title], 
      [v_EmpData].[FullName] AS [FullName], 
      [v_EmpData].[HireDate] AS [HireDate], 
      [v_EmpData].[WORKERTYPENM] AS [WORKERTYPENM], 
      [v_EmpData].[Birth] AS [Birth], 
      [v_EmpData].[HOMESTREET] AS [HOMESTREET], 
      [v_EmpData].[HOMECITY] AS [HOMECITY], 
      [v_EmpData].[HOMEZIP] AS [HOMEZIP], 
      [v_EmpData].[HOMESTATE] AS [HOMESTATE], 
      [v_EmpData].[PicID] AS [PicID], 
      [v_EmpData].[WorkPhone] AS [WorkPhone], 
      [v_EmpData].[HomePhone] AS [HomePhone], 
      [v_EmpData].[WorkCellPhone] AS [WorkCellPhone] 
     FROM [dbo].[v_EmpData] AS [v_EmpData]) AS [Extent8] ON 1 = 1) AS [Join13] ON ([Extent1].[TakenUIN] = [Join13].[UIN]) OR (([Extent1].[TakenUIN] IS NULL) AND ([Join13].[UIN] IS NULL)) 
WHERE ([Extent1].[BeginTime] > (DATEADD (year, -1, SysDateTime()))) 
    AND ('C' <> [Extent1].[Status]) 
    AND ([Extent1].[BeginTime] >= '11/28/2012 12:00:00 AM') 
    AND ([Extent1].[BeginTime] < '11/29/2012 12:00:00 AM') 

이 내 원래 SQL 쿼리 모습과 내가 그것을 가까이 될 것 기대했다 무엇인가 세 개만 필요로 할 때 모든 열을 선택하지 않도록 뷰에 새 선택을 추가하십시오. 그러나 차이가 나는 것 같지 않습니다. LEFT JOIN v_EmpData를 추가하는 대신 LEFT OUTER JOIN을 추가 한 다음 뷰의 모든 열을 선택합니다. 그것은 Select New를 무시하는 것 같습니다.

intellisense가 올바른지 확인하고 각각에 대해 별도의 기능을 가질 필요없이 다양한 검색어를 가질 수 있기 때문에 Linq를 Entities로 사용하여 대다수의 쿼리를 처리하고 싶습니다. 나는 평범한 구식 SQL을 고수해야한다. 나는 큰 혼란을 만들기에 충분하다는 것을 압니다. 어떤 제안?

답변

0

필요한 쿼리가 복잡한 경우.

FunctionImport를 살펴 보겠습니다. 당신의 예상 생성 된 SQL에 1 :

MSDN Function Import

이렇게하면 하나가 될 것 LINQ를 만드는 두통을 저장합니다.

+0

많은 좌절감을 느낀 후에 나는 익숙하지 않은 것으로 나타났습니다. –

+0

많은 좌절감을 느끼고 나는 익숙하지 않은 것으로 나타났습니다. 결과 SQL은 여전히 ​​가비지이므로 사용할 수는 없지만 작동합니다. 난 아직도 왜 그냥 왼쪽 된 조인 대신에 내부 조인에 왼쪽 조인을 추가 이해가 안 돼요하지만 이건 그냥 linq 복잡합니다. t.tblCharters에서 C에서 는 , 새로운 { VEH = v1.Descr ...를 선택 가 list1.DefaultIfEmpty() list1from에서의 V1에 v.ChartVehID 동일 c.Veh에 t.tblChartVehicles v에 참여 ...} –

관련 문제