2016-02-02 83 views
-1

做一些東西linq左連接查詢但面臨一些問題。沒能得到下面的SQL查詢需要轉換成LINQLinq左連接查詢在c#

INSERT INTO tbl_service_order_attributes_versioning(ServiceOrderNo, AttributeId, AttributeValue, parentid, AttributeType, Dt_Stamp, VERSION) 
    SELECT 
     T.ServiceOrderNo, T.COIID, T.COI_Identifier, 
     @pid, 'MBM', getDate(), @ORDERVERSION 
    FROM 
     #temp1 T              
    LEFT JOIN 
     tbl_service_order_attributes_versioning O WITH(NOLOCK) 
      ON T.ServiceOrderNo = O.ServiceOrderNo COLLATE database_default 
      AND T.COIID = O.AttributeID 
      AND O.PARENTID = @pid 
    WHERE 
     O.ServiceOrderNo IS NULL 

我已經轉換此查詢到LINQ查詢正確的結果:

var soiAttr = (from s in ctxParser.TBL_SERVICE_ORDER_ATTRIBUTES_VERSIONING 
       where s.ParentId == parentId 
       select s).ToList(); 

var resultJoinCOI = (from soaI in soiAttr 
        join iFoi in listFOI on soaI.ServiceOrderNo equals iFoi.fulfilmentOrderItemIdentifier 
        where iFoi.coiId == soaI.AttributeId && 
          iFoi.parentId == parentId && 
          soaI.ServiceOrderNo == null 
        select iFoi).ToList(); 

if (resultJoinCOI.Count > 0) 
{ 
    var listToInsert = (from item in resultJoinCOI 
         select new TBL_SERVICE_ORDER_ATTRIBUTES_VERSIONING 
            { 
             ServiceOrderNo = item.fulfilmentOrderItemIdentifier, 
             AttributeId = item.coiId, 
             AttributeValue = item.coiIdentifier, 
             ParentId = parentId, 
             AttributeType = "MBM", 
             DT_Stamp = DateTime.Now, 
             VERSION = orderVersion 
            }); 
       ctxParser.TBL_SERVICE_ORDER_ATTRIBUTES_VERSIONING.AddRange(listToInsert); 
       ctxParser.SaveChanges(); 
      } 

被執行的代碼,但結果是不正確的。

+1

預期結果是什麼,結果如何? –

+0

在sql中有LEFT JOIN在linq中如何做。 bcz linq查詢soaI.ServiceOrderNo == null其不正確。 –

+0

如果我們不知道物體的類型,那麼很難提供幫助。儘管我們做了,但預期的結果仍然是隱身。你期待在'resultJoinCOI'接受什麼?另外,'join'是一個'INNER JOIN',而不是'LEFT',所以'key等於null'的簡單條件可能不夠 –

回答

1

您需要使用DefaultIfEmpty(https://msdn.microsoft.com/en-us/library/bb360179.aspx)。下面是從MSDN閱讀:https://msdn.microsoft.com/en-us/library/bb397895.aspx

在你的情況下,它會是這樣的:即成功執行

var resultJoinCOI = (
       from iFoi in listFOI 
       join soaI in soiAttr on iFoi.fulfilmentOrderItemIdentifier equals soaI.ServiceOrderNo into res 
       from subIFoi in res.DefaultIfEmpty() 
       where iFoi.coiId == soaI.AttributeId && iFoi.parentId == parentId && subIFoi == null 
       select iFoi).ToList(); 
0

以下代碼。並獲得正確的結果。

var soiAttr = (from s in ctxParser.TBL_SERVICE_ORDER_ATTRIBUTES_VERSIONING 
         where s.ParentId == parentId 
         select s).ToList(); 

var resultJoinCOI = (from iFoi in listFOI 
          join soaI in soiAttr on 
          new 
          { 
           ServiceOrderNo = iFoi.fulfilmentOrderItemIdentifier, 
           AttributeId = iFoi.coiId 
          } 
          equals new 
          { 
           ServiceOrderNo = soaI.ServiceOrderNo, 
           AttributeId = soaI.AttributeId 
          } 
          into res 
          from subFoi in res.DefaultIfEmpty() 
          select new 
          { 
           fulfilmentOrderItemIdentifier = iFoi.fulfilmentOrderItemIdentifier, 
           coiId = iFoi.coiId, 
           coiIdentifier = iFoi.coiIdentifier, 
           AttributeId = subFoi == null ? 0 : subFoi.AttributeId, 
           ParentId = subFoi == null ? parentId : subFoi.ParentId, 
           ServiceOrderNo = subFoi == null ? string.Empty: subFoi.ServiceOrderNo 
          }); 

    if (resultJoinCOI != null) 
     { 
      if (resultJoinCOI.Count() > 0) 
      { 
       var listToInsert = (from item in resultJoinCOI 
            select new TBL_SERVICE_ORDER_ATTRIBUTES_VERSIONING 
            { 
             ServiceOrderNo = item.fulfilmentOrderItemIdentifier, 
             AttributeId = item.coiId, 
             AttributeValue = item.coiIdentifier, 
             ParentId = parentId, 
             AttributeType = "MBM", 
             DT_Stamp = DateTime.Now, 
             VERSION = orderVersion 
            }); 
       ctxParser.TBL_SERVICE_ORDER_ATTRIBUTES_VERSIONING.AddRange(listToInsert); 
       ctxParser.SaveChanges(); 
      } 
     } 

這樣,我們就可以實現左聯接在LINQ。按照上面的SQL查詢(參見上面的sql語句)。