簡體   English   中英

LINQ左聯接查詢

[英]LINQ Left join Query

我正在嘗試將sql查詢轉換為LINQ,但是寫查詢后無法從結果集中獲取記錄

SELECT T.ServiceOrderNo,T.STATUS, T.SubStatus,T.orderVersion,T.OrderDate
  ,@pid, T.EventID, 'FOI'    
 FROM #temp1 T     
 LEFT JOIN Tbl_Service_Order_Progress O  ON T.ServiceOrderNo  DATABASE_DEFAULT = O.ServiceOrderNo 
  AND O.PARENTID = @pid    
  AND O.ServiceOrderType  = 'FOI'    
 WHERE O.ServiceOrderNo  IS NULL    

我在LINQ中嘗試以下查詢上方

var lstInsertFOI = (from i in lstFOI
                    join j in lstSOP on i.fulfilmentOrderItemIdentifier equals j.ServiceOrderNo into res
                                from subRight in res.DefaultIfEmpty()
                                where subRight.ParentId == parentId && subRight.ServiceOrderNo == null && subRight.ServiceOrderType.Equals("FOI")
                                select new
                                {
                                    ServiceOrderNo = subRight.ServiceOrderNo == null ? i.fulfilmentOrderItemIdentifier : subRight.ServiceOrderNo,
                                    EventStatus = i.status,
                                    EventSubStatus = i.subStatus,
                                    OrderVersion = i.orderVersion,
                                    EVENTRECEIVEDDATE = i.orderDate,
                                    ParentId = parentId,
                                    EventID = i.eventID,
                                    ServiceOrderType = "FOI",                                    
                                }).ToList();

上面的linq查詢無法獲取預期的結果,該結果應該從lstFOI列表返回記錄數,但不返回記錄。 linq查詢正確嗎?

讓我們從SQL查詢開始。

LEFT JOIN Tbl_Service_Order_Progress O
ON T.ServiceOrderNo = O.ServiceOrderNo 
    AND O.PARENTID = @pid AND O.ServiceOrderType  = 'FOI'

相當於

LEFT JOIN (SELECT * FROM Tbl_Service_Order_Progress 
    WHERE PARENTID = @pid AND ServiceOrderType  = 'FOI') O
ON T.ServiceOrderNo = O.ServiceOrderNo 

然后

WHERE O.ServiceOrderNo  IS NULL

表示查詢實際上是在使用反聯接 ,即包括左側的所有記錄,而右側沒有匹配的記錄。

考慮到所有這些,等效的LINQ查詢應如下所示:

var lstInsertFOI = (
    from i in lstFOI
    join j in lstSOP
        .Where(e => e.ParentId == parentId && subRight.ServiceOrderType == "FOI")
    on i.fulfilmentOrderItemIdentifier equals j.ServiceOrderNo into res
    where !res.Any()
    select new
    {
        ServiceOrderNo = i.fulfilmentOrderItemIdentifier,
        EventStatus = i.status,
        EventSubStatus = i.subStatus,
        OrderVersion = i.orderVersion,
        EVENTRECEIVEDDATE = i.orderDate,
        ParentId = parentId,
        EventID = i.eventID,
        ServiceOrderType = "FOI",                                    
    }).ToList();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM