FF4中的左连接linq查询

Posted

技术标签:

【中文标题】FF4中的左连接linq查询【英文标题】:left join linq query in FF4 【发布时间】:2016-10-02 11:57:24 【问题描述】:

我有以下 SQL 查询:

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和我预想的不一样。

谁能告诉我如何改进我的 linq 查询。

【问题讨论】:

是否及时返回正确结果?因为如果是这样,我就不会太担心 EF 生成的 SQL。 您也可以通过使用导航属性(如from hs in po.HelpdeskFaults.DefaultIfEmpty())来简单地进行左连接 不,因为不返回任何结果。我现在不在工作,但 sql 已经很远了。我对左连接语法感到困惑 【参考方案1】:

这就是我将您的 SQL 查询翻译成的内容

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

我包含了 5 个实体的匿名类,因为您的 SQL 使用的是Select *。我建议将其更改为仅返回所需的最少字段集。

【讨论】:

以上是关于FF4中的左连接linq查询的主要内容,如果未能解决你的问题,请参考以下文章

EF Linq中的左连接Left Join查询

Linq 和 SQL的左连接右连接内链接

LINQ的左连接右连接内连接

LINQ的左连接右连接内连接

LINQ的左连接右连接内连接

LINQ的左连接右连接内连接