2016-06-02 1 views
0

je la requête SQL suivante:gauche se joindre à la requête LINQ dans 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 

Jusqu'à présent, ma requête LINQ ressemble à ceci:

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; 

Mais le sql qui est produit est rien comme ce que je attendu.

Quelqu'un peut-il me donner des indications sur la façon d'améliorer ma requête linq?

+0

Renvoie-t-il les bons résultats en temps opportun? Car si c'est le cas, je ne m'inquiéterais pas trop du SQL produit par EF. – juharr

+0

Aussi vous pouvez simplement les jointures à gauche en utilisant les propriétés de navigation comme 'from hs in po.HelpdeskFaults.DefaultIfEmpty()' – juharr

+0

pas pour ne pas retourner les résultats. Je ne suis pas au travail maintenant, mais le sql est assez éloigné. Je suis confus à propos de la syntaxe de jointure à gauche – dagda1

Répondre

1

C'est ce que je traduirais votre requête SQL dans

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(); 

cette classe I inclus anonyme des 5 entités parce que votre SQL utilise Select *. Je recommanderais de le changer pour ne renvoyer que l'ensemble minimum de champs requis.