2016-06-02 4 views
0
에 LINQ 쿼리에 가입 왼쪽

나는 다음과 같은 SQL 쿼리가 있습니다 는 FF4

SELECT DISTINCT * 
FROM Documents d 
LEFT JOIN 
Invoices 
ON (i.invoicedocumentid = d.id or i.jobsheetdocumentid = d.id) 
INNER JOIN 
PurchaseOrders PO ON i.poid = PO.id 
LEFT JOIN 
HelpDeskFaults f 
ON f.id = PO.helpDeskFaultId 
LEFT JOIN stores s 
ON s.id = f.storeid 
WHERE s.name = 'Linden Drive' 
OR d.id in (
    SELECT u.id as 'docid' 
    FROM documents u 
    INNER JOIN stores s 
    ON u.storeid = s.id 
    WHERE s.name = 'Linden Drive' 
) 
ORDER BY d.Id 

지금까지 내 LINQ 쿼리는 다음과 같습니다를 :

var documents = from doc in context.Documents 
      from invoice in context.Invoices 
      join po in context.PurchaseOrders on invoice.PurchaseOrder.PurchaseOrderId equals po.PurchaseOrderId 
      join hdf in context.HelpDeskFaults on po.HelpdeskFaultId equals hdf.ID into hdfpo 
      from hs in hdfpo.DefaultIfEmpty() 
      join store in context.Stores on hs.StoreID equals store.ID into hsstore 
      from hss in hsstore.DefaultIfEmpty() 
      where hss.Name.Contains(jobSearchParams.StoreName) && (invoice.InvoiceDocumentId == doc.ID || invoice.JobSheetInvoiceId == doc.ID) 
      select doc; 

그러나 생성 된 SQL이 무엇처럼 아무것도 I 예상했다.

누구든지 내 linq 쿼리를 개선하는 방법에 대한 모든 포인터를 줄 수 있습니다.

+0

적시에 올바른 결과를 반환합니까? 만약 그렇다면 나는 EF가 만든 SQL에 대해 너무 걱정하지 않을 것입니다. – juharr

+0

또한 'hs in po.HelpdeskFaults.DefaultIfEmpty()' – juharr

+0

과 같은 탐색 속성을 사용하여 결과를 반환하지 않고 왼쪽 조인을 수행 할 수도 있습니다. 인스턴트 메신저 지금은 직장에 있지만 SQL은 꽤 멀리 제거됩니다. 나는 왼쪽 조인 구문에 대해 혼란 스럽다. – dagda1

답변

1

이것은 내가 당신의 SQL이 Select *을 사용하고 있기 때문에 나는 5 개 단체의 익명 클래스를 포함

var results = 
    (from doc in context.Documents 
    from invoice in (
     from inv in context.Invoices 
     where inv.InvoiceDocumentId == doc.ID || inv.JobSheetInvoiceId == doc.ID 
     select inv).DefaultIfEmpty() 
    from hs in invoice.PurchaseOrder.HelpDeskFaults.DefaultIfEmpty() 
    from hss in hs.Stores.DefaultIfEmpty() 
    where hss.Name == "Linden Drive" || doc.Store.Name == "Linden Drive" 
    order by doc.ID 
    select new 
    { 
     Document = doc, 
     Invoice = invoice, 
     invoice.PurchaseOrder, 
     HelpDeskFault = hs, 
     Store = hss, 
    }).Distinct(); 

로 SQL 쿼리를 번역 할 것입니다. 최소 필드 집합 만 반환하도록 변경하는 것이 좋습니다.