2016-03-02 172 views
1

我試圖SQL查詢轉換爲LINQ但之後寫入查詢無法從結果集LINQ LEFT JOIN查詢

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查詢是否正確?

+0

好像你被錯誤地連接表。你在使用上下文實體還是使用兩個已填充的集合?你能否提供使用過的實體類定義? – Fragment

+0

lstFOI是List 的對象,其中OrderItemDetails是數據庫表,lstSOP是List 的對象,其中TBL_SERVICE_ORDER_PROGRESS是db表,並且fulfilmentOrderItemIdentifier與ServiceOrderNo相同。 – mahesh

回答

0

讓我們從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();