【问题标题】:left join linq query in FF4FF4中的左连接linq查询
【发布时间】: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 已经很远了。我对左连接语法感到困惑

标签: c# entity-framework entity-framework-4


【解决方案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 *。我建议将其更改为仅返回所需的最少字段集。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-13
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 2016-02-17
    相关资源
    最近更新 更多